opensslコマンドラインツールを使用して署名者の秘密キーでメッセージに署名し、以下のコードと同じ結果を取得する方法
using System.Security.Cryptography.Pkcs;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography;
static public byte[] SignMe(X509Certificate2 rsa_cert, Byte[] message)
{
ContentInfo ci = new ContentInfo(message);
SignedCms scms = new SignedCms(ci, true);
CmsSigner signer = new CmsSigner(rsa_cert);
scms.ComputeSignature(signer, false);
return Convert.ToBase64String(scms.Encode());
}
次のコードでも同じ効果が得られます。ここで、rsa_cert_private.key
はキーペアの秘密鍵であり、sign.txt
は署名するメッセージです。結果は、元のメッセージのsha256ダイジェストに基づく署名である新しいファイルsign.txt.sha256
になります。
openssl dgst -sha256 -sign rsa_cert_private.key "-out sign.txt.sha256 sign.txt
しかし、この時点で署名はバイナリ形式であり、base64にそれを取得するには、次のようにします。
base64 sign.txt.sha256> sign.txt.sha256.txt
これは、2番目の新しいファイル(sign.txt.sha256.txt
)を作成します。これは、まったく同じ署名コンテンツですが、b64です。
署名を確認するには、まずそれをバイナリsigに戻す必要があります
base64 -d sign.txt.sha256.txt> sign.txt.sha256
しかし、base64に格納するために追加の手順と(確かに非常に小さい)追加のスペースをとるのではなく、常にバイナリのままにしておく方が簡単です。