Tag: x509

SignerID转换为BouncyCastle库中的X509CertSelector

我正在尝试validation特定邮件是否使用我自己的信任锚识别的实体证书中的有效签名进行签名。 我这样做: public static boolean isValid(CMSSignedData signedData, X509Certificate rootCert) throws Exception { CertStore certsAndCRLs = signedData.getCertificatesAndCRLs(“Collection”, “BC”); SignerInformationStore signers = signedData.getSignerInfos(); Iterator it = signers.getSigners().iterator(); if (it.hasNext()){ SignerInformation signer = (SignerInformation)it.next(); X509CertSelector signerConstraints = signer.getSID(); PKIXCertPathBuilderResult result = buildPath(rootCert, signerID, certsAndCRLs); return signer.verify(result.getPublicKey(), “BC”); } return false; } 但这一行给了我一个编译错误: X509CertSelector signerConstraints = signer.getSID(); 因为它无法从SignerId转换为X509CertSelector。 我尝试使用显式强制转换: […]

修改X509证书

我想表明,如果我从给定的X509证书修改一个位或字节,则签名validation结果为假(因为此修改会导致证书中的哈希值不同)。 我遇到了如何使用getTBSCertificate()方法对证书进行修改的情况。 我的下面的代码完美地完成了validation过程但是我尝试使用位或字节修改的想法使其失败,但它不起作用。 请注意,我提出的这个想法是为了certificate在签名validation时对证书的任何修改都会失败 public class VerifyX509 { private static Certificate getCACert; private static Certificate[] getCert; public static void main(String[] args) throws CertificateEncodingException { setURLConnection(“https://www.google.com”); X509Certificate x509cert= (X509Certificate) getCert[0]; byte[] b= x509cert.getTBSCertificate(); b[0] = (byte) ~b[0]; // HOW TO UPDATE getTBSCertificate() after flipping the b[0] to make Verify() in my method verifySign() return false! verifySign(); […]

Java客户端到WCF服务互操作与相互证书 – 无法解析KeyInfo以validation签名

exception:MessageSecurityException:无法解析用于validation签名的KeyInfo:KeyInfo’SecurityKeyIdentifier 我必须设置一个WCF服务来接收来自Java客户端的SOAP调用,该客户端使用以下标头发送签名内容: … … … CN=XXXXXXXX 111122222 xxxxx xxxx 我尝试过设置以下绑定和行为: 但是我在服务器事件日志中遇到以下exception: ClientIdentity: ActivityId: MessageSecurityException: Cannot resolve KeyInfo for verifying signature: KeyInfo ‘SecurityKeyIdentifier ( IsReadOnly = False, Count = 1, Clause[0] = X509IssuerSerialKeyIdentifierClause(Issuer = ‘CN=XXXXXX) ) ‘, available tokens ‘SecurityTokenResolver ( TokenCount = 0, ) ”。 我们必须让签名validation工作,我们不可能改变java客户端发送的内容。

使用java的X509序列号

我需要从X509证书中获取一些数据。 如果我在Windows中打开证书文件,它会以此格式显示其序列号。 ex. 39 65 70 eb d8 9f 28 20 4e c2 a0 6b 98 48 31 0d 我试图使用java获取相同的数据。 加载后,我使用 x509.getSerialNumber(); and result is : 76292708057987193002565060032465481997 那么这两者有什么区别? 我希望结果为上一个。

X500Principal杰出名称顺序

我正在使用Bouncycastle lib使用X509v3CertificateBuilder类从PKCS10请求生成证书。 它返回构建X509CertificateHolder对象,该对象包含生成的证书。 如果我在持有者上调用getIssuer,它会以正确的顺序返回发行者专有名称(如果我在发行者证书上调用getSubjectX500Principal(),则返回相同的名称),如果我使用java CertificateFactory解析持有者的编码版本,则getIssuerX500Principal ()方法生成的证书以相反的顺序返回DN,有什么不对? 这是我正在尝试做的示例代码: X509CertificateHolder holder = certBuilder.build(sigGen); holder.getIssuer(); //Returns the DN in the correct order (same as in issuer cert) CertificateFactory certFactory = CertificateFactory.getInstance(“X.509”); X509Certificate cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(holder.getEncoded())); cert.getIssuerX500Principal().getName(); //Returns issuer DN in reverse order

新的主题哈希openssl算法不同

从Java Framework管理openssl证书时遇到了一个问题。 openssl x509 -subject_hash … 输出与Java框架在调用X509_NAME_hash()时返回的输出不同,请参见下文。 原因是openssl改变了计算SHA1的方式。 现在,不是像在MD5中那样将哈希基于主题的ASN.1 DER表示,而是首先计算CANONICAL表示,然后根据它计算ASN.1 DER,然后将其用作SHA1算法的输入。 NativeCrypto.java : // — X509_NAME ———————————————————– public static int X509_NAME_hash(X500Principal principal) { return X509_NAME_hash(principal, “SHA1”); } private static int X509_NAME_hash(X500Principal principal, String algorithm) { try { byte[] digest = MessageDigest.getInstance(algorithm).digest(principal.getEncoded()); return Memory.peekInt(digest, 0, ByteOrder.LITTLE_ENDIAN); } catch (NoSuchAlgorithmException e) { throw new AssertionError(e); } } […]

无法解析证书:java.io.IOException:空输入X509Certificate

解析签名时,我收到下面给出的错误。 任何人都知道错误显示的原因? 注意: 使用相同的证书,我签署了自己的XML并validation哪个工作正常。 这意味着证书没有问题。 客户提供的签名文档无法validation。 错误: Exception in thread “main” javax.xml.crypto.MarshalException: Cannot create X509Certificate at org.jcp.xml.dsig.internal.dom.DOMX509Data.unmarshalX509Certificate(DOMX509Data.java:225) at org.jcp.xml.dsig.internal.dom.DOMX509Data.(DOMX509Data.java:116) at org.jcp.xml.dsig.internal.dom.DOMKeyInfo.(DOMKeyInfo.java:116) at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.(DOMXMLSignature.java:150) at org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory.unmarshal(DOMXMLSignatureFactory.java:173) at org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory.unmarshalXMLSignature(DOMXMLSignatureFactory.java:137) at com.signing.ValidateSignedXML.main(ValidateSignedXML.java:126) Caused by: java.security.cert.CertificateException: Could not parse certificate: java.io.IOException: Empty input at sun.security.provider.X509Factory.engineGenerateCertificate(X509Factory.java:104) at java.security.cert.CertificateFactory.generateCertificate(CertificateFactory.java:339) at org.jcp.xml.dsig.internal.dom.DOMX509Data.unmarshalX509Certificate(DOMX509Data.java:223) … 6 more Caused by: java.io.IOException: Empty input at sun.security.provider.X509Factory.engineGenerateCertificate(X509Factory.java:101) […]

将PFX文件导入现有JKS文件(不从.pfx转换为.jks)

我有Java Web服务,并使用Java Keytool创建的jks文件实现了X.509。 keytool -genkey -keyalg RSA -sigalg SHA1withRSA -validity 730 -alias myservicekey -keypass skpass -storepass sspass -keystore serviceKeystore.jks -dname “cn=localhost” keytool -genkey -keyalg RSA -sigalg SHA1withRSA -validity 730 -alias myclientkey -keypass ckpass -storepass cspass -keystore clientKeystore.jks -dname “cn=clientuser” 要在客户端和服务器之间建立信任,我将服务器证书导入客户端和客户端证书到服务器。 将服务器公钥(证书)导入客户端。 keytool -export -rfc -keystore clientKeystore.jks -storepass cspass -alias myclientkey -file MyClient.cer keytool -import -trustcacerts […]

检索x509证书的序列号时缺少前导零

我正在尝试从X.509证书中获取序列号。当我将我的代码生成的序列号与实际序列号(在Windows上)进行比较时,实际序列号(X509证书)的前导零是失踪。 任何建议或替代方法来获取hex的x.509证书的序列号与前导零? 以下是我目前使用的代码段: InputStream in = new FileInputStream(“cert”); CertificateFactory certificateFactory = CertificateFactory.getInstance(“X.509”); X509Certificate certificate = (X509Certificate) certificateFactory.generateCertificate(in); String serialNum = certificate.getSerialNumber().toString(16); System.out.println(serialNum);

用于Java的x509证书解析库

任何推荐的Java加密库。 我需要的是能够解析X.509证书以提取其中包含的信息。 谢谢