2016-06-14 9 views
0

から私は、証明書を生成するためにJava取得ExtensionValueのX509Certificate

CertificateFactory.getInstance("X509", "BC") 
certFactory.generateCertificate(in) 

にはBouncyCastle使用します。それはうまく動作します。しかし、私が使用するとき

x509Certificate.getExtensionValue("1.2.3.4.5.6.7") 

戻り値はmembersrvcのものと一致しません。 私はいくつかのことを忘れましたか?

答えて

0

はBouncyCastleを使用すると、拡張子

public ASN1Primitive getExtensionValue(X509Certificate certificate, String oid) throws IOException { 
    byte[] bytes = certificate.getExtensionValue(oid); 
    if (bytes == null) { 
     return null; 
    } 
    ASN1InputStream aIn = new ASN1InputStream(new ByteArrayInputStream(bytes)); 
    ASN1OctetString octs = (ASN1OctetString) aIn.readObject(); 
    aIn = new ASN1InputStream(new ByteArrayInputStream(octs.getOctets())); 
    return aIn.readObject(); 
} 

ASN1は、複雑なオブジェクトであるのASN1構造を抽出するためにこれを行うことができ、あなたは、目的のフィールドを取得するために、それを解析する必要があります。例えば、与えられたX509証明書内にあるCA URIメタデータを返すこと。

public String getIssuerURL(final X509Certificate certificate) throws Exception { 

    final ASN1ObjectIdentifier ocspAccessMethod = X509ObjectIdentifiers.id_ad_caIssuers; 
    final byte[] authInfoAccessExtensionValue = certificate.getExtensionValue(Extension.authorityInfoAccess.getId()); 
    if (null == authInfoAccessExtensionValue) { 
     return null; 
    } 

    ASN1InputStream ais1 = null; 
    ASN1InputStream ais2 = null; 
    try { 

     final ByteArrayInputStream bais = new ByteArrayInputStream(authInfoAccessExtensionValue); 
     ais1 = new ASN1InputStream(bais); 
     final DEROctetString oct = (DEROctetString) (ais1.readObject()); 
     ais2 = new ASN1InputStream(oct.getOctets()); 
     final AuthorityInformationAccess authorityInformationAccess = AuthorityInformationAccess.getInstance(ais2.readObject()); 

     final AccessDescription[] accessDescriptions = authorityInformationAccess.getAccessDescriptions(); 
     for (AccessDescription accessDescription : accessDescriptions) { 

      final boolean correctAccessMethod = accessDescription.getAccessMethod().equals(ocspAccessMethod); 
      if (!correctAccessMethod) { 

       continue; 
      } 
      final GeneralName gn = accessDescription.getAccessLocation(); 
      if (gn.getTagNo() != GeneralName.uniformResourceIdentifier) { 

       continue; 
      } 
      final DERIA5String str = (DERIA5String) ((DERTaggedObject) gn.toASN1Primitive()).getObject(); 
      final String accessLocation = str.getString(); 
      return accessLocation; 
     } 
     return null; 
    } catch (IOException e) { 
     throw new Exception(e); 
    } finally { 
     IOUtils.closeQuietly(ais1); 
     IOUtils.closeQuietly(ais2); 
    } 
} 

ASN1Primitive

public String getStringFromGeneralName(ASN1Primitive names) throws IOException { 
    ASN1TaggedObject taggedObject = (ASN1TaggedObject) names ; 
    return new String(ASN1OctetString.getInstance(taggedObject, false).getOctets(), "ISO-8859-1"); 
} 
から判読できる文字列を返すために、
関連する問題