2

テスト用の pfx ファイルがあり、特別なセキュリティはありません。

このファイルを使用して XML ファイルを暗号化する必要があります。シナリオは、Password-Zip ファイルを、Zip に関連するメタデータ ファイルと共にクライアントに送信する必要があるというものです。Zip には、ソフトウェア インストールを更新するためのファイルが実際に含まれます。最初は、Zip 自体を暗号化します。しかしその後、簡単なパスワードで保護し、クライアントの Web サイト (ASP.NET) にアップロードすることが決定されました。クライアントは、圧縮された更新で提供されるメタデータ ファイルもアップロードします。このメタデータ ファイルには、クライアント識別子、MAC アドレス、アップデート zip ファイルの MD5 ハッシュなどが含まれます。送信前にこのメタデータ ファイルを暗号化し、クライアントが ZIP とメタの両方をアップロードしたら復号化する必要があります。復号化したら、クライアントと現在のインストールとパッチ自体を確認しようとします。

PFX が生成されます。

  • PFX から何を抽出する必要がありますか
  • ここで BouncyCastle を使用できます。
  • クライアントが自分の側でソフトウェアをインストールしたら、X509 証明書要求を生成するという考えでした。これにより、リクエストと秘密鍵の 2 つが作成されます。クライアントは秘密鍵を保持し、リクエストを送信します。クライアント (支払いとすべて) を検証し、証明書を生成してメールで返信します (PFX)。次に、それをインポートしてソフトウェアの機能のロックを解除し、圧縮された更新やその他のものを取得できるようにします

質問は、完全なソリューションの要求のようなものですが、私は X509 との契約に関して非常に苦労しています。私は今、BouncyCastle のドキュメントを見ています。

読んでくれてありがとう。どんな助けでも大歓迎です。

4

1 に答える 1

4

長い答えは申し訳ありません。

はい、bouncycastle を使用して pfx から証明書を抽出できます。

var pkcs = new Pkcs12Store(File.Open("path.pfx", FileMode.Open), "password".ToCharArray());
pkcs.Aliases // is a list of certificate names that are in the pfx;
pkcs.GetCertificate(alias); // gets a certificate from the pfx

非常によく似たアプローチを使用しますが、証明書には「秘密」が含まれていないため、秘密鍵なしで証明書を PEM に送り返します。

これは、証明書署名要求を作成する方法です。

//generate a privatekey and public key
RsaKeyPairGenerator rkpg1 = new RsaKeyPairGenerator();
rkpg1.Init(new KeyGenerationParameters(new SecureRandom(), Keystrength));
AsymmetricCipherKeyPair ackp1 = rkpg1.GenerateKeyPair();

RsaPrivateCrtKeyParameters privateKey = (RsaPrivateCrtKeyParameters)ackp1.Private;
RsaKeyParameters publicKey = (RsaKeyParameters)ackp1.Public;

X509Name comonname = new X509Name (cname);
Pkcs10CertificationRequest csr = new Pkcs10CertificationRequest ("SHA1WITHRSA", comonname, publicKey, null, privateKey);
csr.Verify ();

StringBuilder sb = new StringBuilder();
PemWriter pw = new PemWriter (new StringWriter (sb));
pw.WriteObject (csr);
pw.Writer.Flush ();
var pemstring = sb.ToString ();

これは、証明書署名要求に署名するサーバー側で発生することです。

私が理解している限り、ルート証明書は、秘密鍵を持っている任意の証明書にすることができます。また、ブラウザなどの他のアプリケーションで使用する場合は、自己署名証明書の場合は「信頼されたルート認証局」、そうでない場合は「信頼された中間認証局」と呼ばれる証明書ストアに挿入する必要があります。もちろん、秘密鍵なしでクライアントコンピューターで自己署名することはできません。

秘密鍵を含む証明書は、アイコンに追加された小さな鍵によって識別できます。ここを参照してください。Commonname localhost を使用した自己署名証明書

//rootCert contains the rootcertificate in bouncycastle format

var pemstring = "a string containing the PEM";
PemReader pr = new PemReader (new StringReader (pemstring));
Pkcs10CertificationRequest csr = (Pkcs10CertificationRequest)pr.ReadObject ();

X509V3CertificateGenerator certgen = new X509V3CertificateGenerator();
certgen.SetSubjectDN(csr.GetCertificationRequestInfo().Subject);
certgen.SetIssuerDN(rootCert.SubjectDN);
certgen.SetPublicKey(csr.GetPublicKey());
certgen.SetSignatureAlgorithm(csr.SignatureAlgorithm.ObjectID.Id);
certgen.SetNotAfter(validThrough); //a datetime object
certgen.SetNotBefore(validFrom); //a datetime object
certgen.SetSerialNumber(serialNumber); //a biginteger

X509Certificate clientcert = certgen.Generate(rootPrivateKey);

//to send the certificate without the private key to the client you'll have to 
//convert it to PEM:

StringBuilder sb = new StringBuilder();
PemWriter pw = new PemWriter (new StringWriter (sb));
pw.WriteObject (clientcert);
pw.Writer.Flush ();
var pemstring = sb.ToString ();

//to make it a .net certificate use:
X509Certificate2 netcert = DotNetUtilities.ToX509Certificate (clientcert);

クライアント証明書には秘密鍵 atm が含まれていません。これは、クライアント側で次のように再び発生します。

//where pemstring contains the certificate in a PEMstring like shown above.
//and privateKey is the one we had in the first part over at the client.

PemReader pr = new PemReader(new StringReader(pemstring));
X509Certificate2 cert = DotNetUtilities.ToX509Certificate((Bouncy.X509Certificate)pr.ReadObject());

CspParameters cparms = new CspParameters
{
    CryptoKeySecurity = new CryptoKeySecurity(),
    Flags = CspProviderFlags.UseMachineKeyStore
};

RSACryptoServiceProvider rcsp = new RSACryptoServiceProvider(cparms);
RSAParameters parms = new RSAParameters
{
    Modulus = privateKey.Modulus.ToByteArrayUnsigned (),
    P = privateKey.P.ToByteArrayUnsigned (),
    Q = privateKey.Q.ToByteArrayUnsigned (),
    DP = privateKey.DP.ToByteArrayUnsigned (),
    DQ = privateKey.DQ.ToByteArrayUnsigned (),
    InverseQ = privateKey.QInv.ToByteArrayUnsigned (),
    D = privateKey.Exponent.ToByteArrayUnsigned (),
    Exponent = privateKey.PublicExponent.ToByteArrayUnsigned ()
};

rcsp.ImportParameters(parms);

netcert.PrivateKey = rcsp;
于 2012-07-11T09:07:55.893 に答える