2011-01-13 30 views
2

可能性の重複:私が例えばその後
Generated signed X.509 client certificate is invalid (no certificate chain to its CA)- 無効なデジタル署名

http://www.bouncycastle.org/wiki/display/JA1/X.509+Public+Key+Certificate+and+Certification+Request+Generation

をしかし署名し得クライアント証明書は、ウィンドウで開いたときに次のエラーが発生します。

「このファイルには、次のように使用するために無効です。セキュリティ証明書」私はとにかくそれをインストールし、CertMgrのでそれを表示した場合、証明書パスがOKに見える

- 私は私の自己署名認証局を(参照問題はありません)、クライアント証明書のステータスは次のとおりです。

"この証明書には無効なデジタル署名があります。

私はX509Certificate.Verify()を呼び出す場合は、次の例外がスローされます。

「公開鍵証明書の署名のためではない提示」

をしかし、私はPkcs10CertificationRequestから抽出されたまったく同じ公開鍵を使用していますし、私がVerify()を呼んだとき、それは問題ありません。

アイデア?これで苦労した日々の後、私はこの最後のものを除いてすべての作品を手に入れました - そして、本当に混乱しているのは、私の自己署名入りのCA証明書がうまくいくことです。クライアント証明書には何か問題があります。コード全体がここにあります:

 TextReader textReader = new StreamReader("certificaterequest.pkcs10"); 
     PemReader pemReader = new PemReader(textReader); 

     Pkcs10CertificationRequest certificationRequest = (Pkcs10CertificationRequest)pemReader.ReadObject(); 
     CertificationRequestInfo certificationRequestInfo = certificationRequest.GetCertificationRequestInfo(); 
     SubjectPublicKeyInfo publicKeyInfo = certificationRequestInfo.SubjectPublicKeyInfo; 

     RsaPublicKeyStructure publicKeyStructure = RsaPublicKeyStructure.GetInstance(publicKeyInfo.GetPublicKey()); 

     RsaKeyParameters publicKey = new RsaKeyParameters(false, publicKeyStructure.Modulus, publicKeyStructure.PublicExponent); 

     bool certIsOK = certificationRequest.Verify(publicKey); 
     // public key is OK here... 

     // get the server certificate 
     Org.BouncyCastle.X509.X509Certificate serverCertificate = DotNetUtilities.FromX509Certificate(System.Security.Cryptography.X509Certificates.X509Certificate.CreateFromCertFile("servermastercertificate.cer")); 

     // get the server private key 
     byte[] privateKeyBytes = File.ReadAllBytes("serverprivate.key"); 
     AsymmetricKeyParameter serverPrivateKey = PrivateKeyFactory.CreateKey(privateKeyBytes); 

     // generate the client certificate 
     X509V3CertificateGenerator generator = new X509V3CertificateGenerator(); 

     generator.SetSerialNumber(BigInteger.ProbablePrime(120, new Random())); 
     generator.SetIssuerDN(serverCertificate.SubjectDN); 
     generator.SetNotBefore(DateTime.Now); 
     generator.SetNotAfter(DateTime.Now.AddYears(5)); 
     generator.SetSubjectDN(certificationRequestInfo.Subject); 
     generator.SetPublicKey(publicKey); 
     generator.SetSignatureAlgorithm("SHA512withRSA"); 
     generator.AddExtension(X509Extensions.AuthorityKeyIdentifier, false, new AuthorityKeyIdentifierStructure(serverCertificate)); 
     generator.AddExtension(X509Extensions.SubjectKeyIdentifier, false, new SubjectKeyIdentifierStructure(publicKey)); 

     var newClientCert = generator.Generate(serverPrivateKey); 

     newClientCert.Verify(publicKey); // <-- this blows up 

     return DotNetUtilities.ToX509Certificate(newClientCert).Export(X509ContentType.Pkcs12, "user password"); 
+0

少なくとも、キーの使用は設定されていません。 –

+0

それは本当ですが、私はまだそれを得ていません。クライアント証明書の「無効な公開鍵」エラーについて説明しますか?私は自分の署名したCA証明書にそれを設定せず、Windowsはそれを「すべての用途」として認識します。 – znelson

+0

自己署名証明書の作成に使用したコマンドを送信できますか? –

答えて

1

私はこれを理解しました。 X509Certificate.Verify(publicKey)に電話する場合は、Pkcs10CertificationRequestのクライアントの公開鍵ではなく、CAの公開鍵を渡す必要があります。