【问题标题】:How to use BouncyCastle to generate X509Certificate2 which can be used for WCF authentication?如何使用 BouncyCastle 生成可用于 WCF 身份验证的 X509Certificate2?
【发布时间】:2012-02-12 16:04:15
【问题描述】:

这是我的 WCF 服务代码:

        ServiceHost svh = new ServiceHost(typeof(MyClass));

        var tcpbinding = new NetTcpBinding(SecurityMode.TransportWithMessageCredential, true);
        //security

        tcpbinding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
        svh.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new BWUserNamePasswordValidator();
        svh.Credentials.UserNameAuthentication.UserNamePasswordValidationMode =UserNamePasswordValidationMode.Custom;
        svh.Credentials.ServiceCertificate.Certificate = GenerateCertificate(myCert);

        svh.AddServiceEndpoint(typeof(IMyClass), tcpbinding, location);            

        svh.Open();

这是我用来生成证书的代码:

    static X509Certificate2 GenerateCertificate(string certName)
    {
        var keypairgen = new RsaKeyPairGenerator();
        keypairgen.Init(new KeyGenerationParameters(new SecureRandom(new CryptoApiRandomGenerator()), 1024));

        var keypair = keypairgen.GenerateKeyPair();

        var gen = new X509V3CertificateGenerator();

        var CN = new X509Name("CN=" + certName);
        var SN = BigInteger.ProbablePrime(120, new Random());

        gen.SetSerialNumber(SN);
        gen.SetSubjectDN(CN);
        gen.SetIssuerDN(CN);
        gen.SetNotAfter(DateTime.MaxValue);
        gen.SetNotBefore(DateTime.Now.Subtract(new TimeSpan(7, 0, 0, 0)));
        gen.SetSignatureAlgorithm("MD5WithRSA");
        gen.SetPublicKey(keypair.Public);

        gen.AddExtension(X509Extensions.SubjectKeyIdentifier, false,
                    new SubjectKeyIdentifierStructure(keypair.Public));        

        var newCert = gen.Generate(keypair.Private);

        return new X509Certificate2(DotNetUtilities.ToX509Certificate((Org.BouncyCastle.X509.X509Certificate)newCert));
    }

当我启动服务器时,它会崩溃并出现以下异常:

ArgumentException: It is likely that certificate 'CN=MyCert' may not 
have a private key that is capable of key exchange or the process may not have 
access rights for the private key. Please see inner exception for detail.

内部异常为空。

我做错了什么?

【问题讨论】:

    标签: c# wcf security x509certificate bouncycastle


    【解决方案1】:

    需要为此目的明确创建用于证书交换的密钥对。我认为您只需要像这样向您的证书生成器添加另一个扩展:

    gen.AddExtension(
        X509Extensions.KeyUsage, 
        true,
        new KeyUsage(KeyUsage.keyCertSign));
    

    不确定该语法是否完全正确,但这就是想法:您需要将证书中的密钥设置为用于证书签名,如果存在,这是一个“关键”扩展。

    【讨论】:

    • 添加了参数。该服务仍然不会从它开始。我正在尝试使用 makecert 创建一个可行的证书,正确的命令序列是 makecert -n "CN=mfcertificate" -cy authority -a sha1 -sv "nick_ca.pvk" -r "nick_ca.cer" makecert -pe - n "CN=my Dev" -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -ic "nick_ca.cer" -iv "nick_ca.pvk" -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 -sv "nick_dev.pvk" "nick_dev.cer" pvk2pfx -pvk "nick_dev.pvk" -spc "nick_dev.cer" -pfx "nick_dev.pfx" 不过我不知道如何在 BouncyCastle 中执行此操作跨度>
    • 您得到的错误将使用带有“-sky exchange”参数的 makecert 来解决,我只是不知道 BouncyCastle API 知道如何做到这一点。对不起。
    猜你喜欢
    • 2010-11-17
    • 2019-06-23
    • 2023-03-18
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多