2016-05-26 18 views
0

SSL証明書を購入しました。arvixeは自己署名証明書をサポートしていません。私は秘密鍵を.pemファイルに持っていますが、これはRSA署名銀行取引パラメータに使用したいものです。これまでのところ、私はそれができる方法を発見していない。インポートした秘密鍵を使用したRSA署名

certificate.PrivateKeyは、キーセットが見つかりませんでした例外をスローします。バウンシーキャッスルを使用して秘密鍵(.pem)ファイルをインポートすると、RSACryptoServiceProviderに変換する必要があるポイントまでうまく動作します。その時点で、DotNetUtilities.ToRSAはFile Not Found例外をスローします。これを行うにはより良い方法が必要です!

は、ここに私のコードから関連するスニペットです:

  public string SignRsa(string stringToSign) 
     { 
      var encoder = new ASCIIEncoding(); 
      var binData = encoder.GetBytes(stringToSign); 
      byte[] binSignature; 

      if (Request.Url.OriginalString.IndexOf("localhost", StringComparison.Ordinal) < 0) 
      { 
       var store = new X509Store(StoreLocation.LocalMachine); 
       store.Open(OpenFlags.ReadOnly); 
       var certificates = store.Certificates; 
       var signed = string.Empty; 
       X509Certificate2 ipCert = certificates.Find(X509FindType.FindBySubjectName, "www.ingyenpiac.com", false).OfType<X509Certificate2>().First(); 
       RSACryptoServiceProvider rsaCsp; 
       if (ipCert != null) 
       { 
        AsymmetricCipherKeyPair keyPair; 
        using (var reader = System.IO.File.OpenText(Server.MapPath("~/App_Data/private_key.pem"))) // file containing RSA PKCS1 private key 
         keyPair = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject(); 
        PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(keyPair.Private); 
        byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetDerEncoded(); 
        string serializedPrivate = Convert.ToBase64String(serializedPrivateBytes); 
        SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keyPair.Public); 
        byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded(); 
        string serializedPublic = Convert.ToBase64String(serializedPublicBytes); 
        RsaPrivateCrtKeyParameters privateKey = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(serializedPrivate)); 
        RsaKeyParameters publicKey = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(serializedPublic)); 
        var kpp = keyPair.Private as RsaPrivateCrtKeyParameters; 
        var ppk = DotNetUtilities.ToRSA(kpp); // <==== File not found exception!!!! WTF??? 
        RSACryptoServiceProvider tempRcsp = (RSACryptoServiceProvider)ppk; 
        RSACryptoServiceProvider rcsp = new RSACryptoServiceProvider(new CspParameters(1, "Microsoft Strong Cryptographic Provider", new Guid().ToString(), new CryptoKeySecurity(), null)); 
        rcsp.ImportCspBlob(tempRcsp.ExportCspBlob(true)); 
        ipCert.PrivateKey = rcsp; 
        if (ipCert.Verify()) 
        { 
         rsaCsp = (RSACryptoServiceProvider)ipCert.PrivateKey; 
        } 
        else 
         throw new ApplicationException("Certificate failed to verify."); 
       } 
       else 
        throw new ApplicationException("SignRsa: No certifciate found"); 
       using (var sha = new SHA1CryptoServiceProvider()) 
       { 
        binSignature = rsaCsp.SignData(binData, sha); 
       } 
       if (rsaCsp.VerifyData(binData, new SHA1CryptoServiceProvider(), binSignature)) 
        signed = BitConverter.ToString(binSignature).Replace("-", string.Empty); 
       store.Close(); 
       return signed; 
      } 
return null; 
} 

私は必ず誰かがこれで私を助けることを願って!

答えて

1

このコードはビットを簡素化することができます.NET 4.6では:

public string SignRsa(string stringToSign) 
{ 
    var signed = string.Empty; 

    using (var ipCert = new X509Certificate2(Server.MapPath("~/App_Data/pfxFile.pfx"), "password")) 
    using (var RSA = ipCert.GetRSAPrivateKey()) 
    { 
     // Note, if the cert was not RSA, or had no private key, RSA 
     // will be null. But you didn't check it, so I won't. 
     var binData = System.Text.Encoding.ASCII.GetBytes(stringToSign); 
     byte[] binSignature = RSA.SignData(binData, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1); 

     // Not sure why you want to re-verify the signature, but OK: 
     if (RSA.VerifyData(binData, binSignature, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1)) 
      signed = BitConverter.ToString(binSignature).Replace("-", string.Empty); 

     return signed; 
    } 
} 
0

うわー!私は事を過度に複雑にしました。弾力のある城の必要はなく、曲がりくねっている。答えは、非常に簡単だった、以下に示す:

public string SignRsa(string stringToSign) 
    { 
     ASCIIEncoding encoder; 
     var signed = string.Empty; 
     var ipCert = new X509Certificate2(Server.MapPath("~/App_Data/pfxFile.pfx"), "password"); 
     var RSA = (RSACryptoServiceProvider)ipCert.PrivateKey; 
     encoder = new ASCIIEncoding(); 
     var binData = encoder.GetBytes(stringToSign); 
     byte[] binSignature; 
     using (var sha1 = new SHA1CryptoServiceProvider()) 
      binSignature = RSA.SignData(binData, sha1); 
     if (RSA.VerifyData(binData, new SHA1CryptoServiceProvider(), binSignature)) 
      signed = BitConverter.ToString(binSignature).Replace("-", string.Empty); 
     return signed; 
    } 
関連する問題