📄 x509certificate.java
字号:
public boolean hasUnsupportedCriticalExtension() { for (Iterator it = extensions.values().iterator(); it.hasNext(); ) { Extension e = (Extension) it.next(); if (e.isCritical() && !e.isSupported()) return true; } return false; } public Set getCriticalExtensionOIDs() { HashSet s = new HashSet(); for (Iterator it = extensions.values().iterator(); it.hasNext(); ) { Extension e = (Extension) it.next(); if (e.isCritical()) s.add(e.getOid().toString()); } return Collections.unmodifiableSet(s); } public Set getNonCriticalExtensionOIDs() { HashSet s = new HashSet(); for (Iterator it = extensions.values().iterator(); it.hasNext(); ) { Extension e = (Extension) it.next(); if (!e.isCritical()) s.add(e.getOid().toString()); } return Collections.unmodifiableSet(s); } public byte[] getExtensionValue(String oid) { Extension e = getExtension(new OID(oid)); if (e != null) { return e.getValue().getEncoded(); } return null; } // GnuPKIExtension method. // ------------------------------------------------------------------------- public Extension getExtension(OID oid) { return (Extension) extensions.get(oid); } public Collection getExtensions() { return extensions.values(); } // Certificate methods. // ------------------------------------------------------------------------- public byte[] getEncoded() throws CertificateEncodingException { return (byte[]) encoded.clone(); } public void verify(PublicKey key) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException, SignatureException { Signature sig = Signature.getInstance(sigAlgId.toString()); doVerify(sig, key); } public void verify(PublicKey key, String provider) throws CertificateException, NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException, SignatureException { Signature sig = Signature.getInstance(sigAlgId.toString(), provider); doVerify(sig, key); } public String toString() { StringWriter str = new StringWriter(); PrintWriter out = new PrintWriter(str); out.println(X509Certificate.class.getName() + " {"); out.println(" TBSCertificate {"); out.println(" version = " + version + ";"); out.println(" serialNo = " + serialNo + ";"); out.println(" signature = {"); out.println(" algorithm = " + getSigAlgName() + ";"); out.print(" parameters ="); if (sigAlgVal != null) { out.println(); out.print(Util.hexDump(sigAlgVal, " ")); } else { out.println(" null;"); } out.println(" }"); out.println(" issuer = " + issuer.getName() + ";"); out.println(" validity = {"); out.println(" notBefore = " + notBefore + ";"); out.println(" notAfter = " + notAfter + ";"); out.println(" }"); out.println(" subject = " + subject.getName() + ";"); out.println(" subjectPublicKeyInfo = {"); out.println(" algorithm = " + subjectKey.getAlgorithm()); out.println(" key ="); out.print(Util.hexDump(subjectKey.getEncoded(), " ")); out.println(" };"); out.println(" issuerUniqueId = " + issuerUniqueId + ";"); out.println(" subjectUniqueId = " + subjectUniqueId + ";"); out.println(" extensions = {"); for (Iterator it = extensions.values().iterator(); it.hasNext(); ) { out.println(" " + it.next()); } out.println(" }"); out.println(" }"); out.println(" signatureAlgorithm = " + getSigAlgName() + ";"); out.println(" signatureValue ="); out.print(Util.hexDump(signature, " ")); out.println("}"); return str.toString(); } public PublicKey getPublicKey() { return subjectKey; } public boolean equals(Object other) { if (!(other instanceof X509Certificate)) return false; try { if (other instanceof X509Certificate) return Arrays.equals(encoded, ((X509Certificate) other).encoded); byte[] enc = ((X509Certificate) other).getEncoded(); if (enc == null) return false; return Arrays.equals(encoded, enc); } catch (CertificateEncodingException cee) { return false; } } // Own methods. // ------------------------------------------------------------------------ /** * Verify this certificate's signature. */ private void doVerify(Signature sig, PublicKey key) throws CertificateException, InvalidKeyException, SignatureException { logger.log (Component.X509, "verifying sig={0} key={1}", new Object[] { sig, key }); sig.initVerify(key); sig.update(tbsCertBytes); if (!sig.verify(signature)) { throw new CertificateException("signature not validated"); } } /** * Parse a DER stream into an X.509 certificate. * * @param encoded The encoded bytes. */ private void parse(InputStream encoded) throws Exception { DERReader der = new DERReader(encoded); // Certificate ::= SEQUENCE { DERValue cert = der.read(); logger.log (Component.X509, "start Certificate len == {0}", new Integer (cert.getLength())); this.encoded = cert.getEncoded(); if (!cert.isConstructed()) { throw new IOException("malformed Certificate"); } // TBSCertificate ::= SEQUENCE { DERValue tbsCert = der.read(); if (tbsCert.getValue() != DER.CONSTRUCTED_VALUE) { throw new IOException("malformed TBSCertificate"); } tbsCertBytes = tbsCert.getEncoded(); logger.log (Component.X509, "start TBSCertificate len == {0}", new Integer (tbsCert.getLength())); // Version ::= INTEGER [0] { v1(0), v2(1), v3(2) } DERValue val = der.read(); if (val.getTagClass() == DER.CONTEXT && val.getTag() == 0) { version = ((BigInteger) der.read().getValue()).intValue() + 1; val = der.read(); } else { version = 1; } logger.log (Component.X509, "read version == {0}", new Integer (version)); // SerialNumber ::= INTEGER serialNo = (BigInteger) val.getValue(); logger.log (Component.X509, "read serial number == {0}", serialNo); // AlgorithmIdentifier ::= SEQUENCE { val = der.read(); if (!val.isConstructed()) { throw new IOException("malformed AlgorithmIdentifier"); } int certAlgLen = val.getLength(); logger.log (Component.X509, "start AlgorithmIdentifier len == {0}", new Integer (certAlgLen)); val = der.read(); // algorithm OBJECT IDENTIFIER, algId = (OID) val.getValue(); logger.log (Component.X509, "read algorithm ID == {0}", algId); // parameters ANY DEFINED BY algorithm OPTIONAL } if (certAlgLen > val.getEncodedLength()) { val = der.read(); if (val == null) { algVal = null; } else { algVal = val.getEncoded(); if (val.isConstructed()) encoded.skip(val.getLength()); } logger.log (Component.X509, "read algorithm parameters == {0}", algVal); } // issuer Name, val = der.read(); issuer = new X500DistinguishedName(val.getEncoded()); der.skip(val.getLength()); logger.log (Component.X509, "read issuer == {0}", issuer); // Validity ::= SEQUENCE { // notBefore Time, // notAfter Time } if (!der.read().isConstructed()) { throw new IOException("malformed Validity"); } notBefore = (Date) der.read().getValue(); logger.log (Component.X509, "read notBefore == {0}", notBefore); notAfter = (Date) der.read().getValue(); logger.log (Component.X509, "read notAfter == {0}", notAfter); // subject Name, val = der.read(); subject = new X500DistinguishedName(val.getEncoded()); der.skip(val.getLength()); logger.log (Component.X509, "read subject == {0}", subject); // SubjectPublicKeyInfo ::= SEQUENCE { // algorithm AlgorithmIdentifier, // subjectPublicKey BIT STRING } DERValue spki = der.read(); if (!spki.isConstructed()) { throw new IOException("malformed SubjectPublicKeyInfo"); } KeyFactory spkFac = KeyFactory.getInstance("X.509"); subjectKey = spkFac.generatePublic(new X509EncodedKeySpec(spki.getEncoded())); der.skip(spki.getLength()); logger.log (Component.X509, "read subjectPublicKey == {0}", subjectKey); val = der.read(); if (version >= 2 && val.getTagClass() != DER.UNIVERSAL && val.getTag() == 1) { byte[] b = (byte[]) val.getValue(); issuerUniqueId = new BitString(b, 1, b.length-1, b[0] & 0xFF); logger.log (Component.X509, "read issuerUniqueId == {0}", issuerUniqueId); val = der.read(); } if (version >= 2 && val.getTagClass() != DER.UNIVERSAL && val.getTag() == 2) { byte[] b = (byte[]) val.getValue(); subjectUniqueId = new BitString(b, 1, b.length-1, b[0] & 0xFF); logger.log (Component.X509, "read subjectUniqueId == {0}", subjectUniqueId); val = der.read(); } if (version >= 3 && val.getTagClass() != DER.UNIVERSAL && val.getTag() == 3) { val = der.read(); logger.log (Component.X509, "start Extensions len == {0}", new Integer (val.getLength())); int len = 0; while (len < val.getLength()) { DERValue ext = der.read(); logger.log (Component.X509, "start extension len == {0}", new Integer (ext.getLength())); Extension e = new Extension(ext.getEncoded()); extensions.put(e.getOid(), e); der.skip(ext.getLength()); len += ext.getEncodedLength(); logger.log (Component.X509, "read extension {0} == {1}", new Object[] { e.getOid (), e }); logger.log (Component.X509, "count == {0}", new Integer (len)); } val = der.read (); } logger.log (Component.X509, "read value {0}", val); if (!val.isConstructed()) { throw new CertificateException ("malformed AlgorithmIdentifier"); } int sigAlgLen = val.getLength(); logger.log (Component.X509, "start AlgorithmIdentifier len == {0}", new Integer (sigAlgLen)); val = der.read(); sigAlgId = (OID) val.getValue(); logger.log (Component.X509, "read algorithm id == {0}", sigAlgId); if (sigAlgLen > val.getEncodedLength()) { val = der.read(); if (val.getValue() == null) { if (subjectKey instanceof DSAPublicKey) { AlgorithmParameters params = AlgorithmParameters.getInstance("DSA"); DSAParams dsap = ((DSAPublicKey) subjectKey).getParams(); DSAParameterSpec spec = new DSAParameterSpec(dsap.getP(), dsap.getQ(), dsap.getG()); params.init(spec); sigAlgVal = params.getEncoded(); } } else { sigAlgVal = (byte[]) val.getEncoded(); } if (val.isConstructed()) { encoded.skip(val.getLength()); } logger.log (Component.X509, "read parameters == {0}", sigAlgVal); } signature = ((BitString) der.read().getValue()).toByteArray(); logger.log (Component.X509, "read signature ==\n{0}", Util.hexDump(signature, ">>>> ")); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -