1

欲しいもの

切り離されたデジタル署名を標準形式(CMS / CAdES-EPES)で作成します。

今デジタル署名を作成する方法

ドキュメント(SHA-256)からハッシュを作成し、ハッシュアルゴリズムIDを取得して、すべてをメッセージに入れ、スマートカード(JavaCard)に送信します。このメッセージ(RSA-512)に対して分離された署名が生成され、返送されます。コードを使用して、純粋なJava(これまでのところBouncyCastleはありません)を使用してこの署名を検証できます。

RSAPublicKey pubK = (RSAPublicKey) cert.getPublicKey();
Signature sig = Signature.getInstance("SHA256withRSA", "BC");
sig.initVerify(pubK);
//load signed file and update sig
...
sig.verify(signedMessage)

問題

私の目標は、すでに署名されたデータからCMS(PKCS#7)署名を取得することです。ただし、ここで説明したように、証明書を持っている場合、PKCS#1をPKCS#7に変換するにはどうすればよいですか?-署名された属性があるため、CMSに「変換」するのはそれほど簡単ではありません。さて、とにかく試してみたいとしましょう(バックアップソリューションを用意するためだけに)。まず、BouncyCastleを使ってみました。ただし、すでに署名されたデータを使用し、主キーにアクセスできない場合(スマートカードにあるため、エクスポートできません)、それを行う方法を見つけることができませんでした。だから私はこのようなネイティブJavaライブラリでそれを試しました:

X500Name xName = X500Name.asX500Name(cert.getSubjectX500Principal());
BigInteger serial   = cert.getSerialNumber();
AlgorithmId digestAlgorithmId = new AlgorithmId(AlgorithmId.SHA512_oid);
AlgorithmId signAlgorithmId = new AlgorithmId(AlgorithmId.RSAEncryption_oid);

//SignerInfo
SignerInfo sInfo = new SignerInfo(xName, serial, digestAlgorithmId, signAlgorithmId, signatureBytes);
//Create ContentInfo
ContentInfo cInfo = new ContentInfo(ContentInfo.DATA_OID, new DerValue(DerValue.tag_OctetString, dataToSign));
//create PKCS7 signature
PKCS7 p7 = new PKCS7(new AlgorithmId[] { digestAlgorithmId }, cInfo,
        new java.security.cert.X509Certificate[] { cert },
        new SignerInfo[] { sInfo });
//Write PKCS7 to bYteArray
ByteArrayOutputStream bOut = new DerOutputStream();
p7.encodeSignedData(bOut);
byte[] encodedPKCS7 = bOut.toByteArray();

このアプローチは正直なところ「正しくない」ように思われ、PKCS7.verify()メソッドを使用して検証することもできませんでした(nullが返され、検証に失敗し、例外はスローされません)。

だから私の質問は:

  1. JavaCardからCMS署名を直接取得する方法はありますか?
  2. (秘密鍵へのアクセスなしで)署名者証明書のみを使用して、すでに生成された署名からCMS署名を作成することは可能ですか?
  3. 上記の「変換」コードに問題がありますか?
  4. 切り離された署名を検証するために使用できるツールを知っていますか?(私の結果を確認できるようにするため)

Aは2週間前から答えを探していましたが、私は本当に必死です。あらゆる種類の情報/ヘルプをありがとう。

4

1 に答える 1

1

(1)JavaCardからCMS署名を直接取得する方法はありますか?

あなたがJavaCardをプログラミングしているのであれば、JavaCardは非常に用途が広いので、それは可能かもしれません。ただし、これらのCMSコンテナを取得するために必要な通信は非常に独占的であり、ほとんどの場合、コード(顧客にとっては良いことも悪いこともありますが、顧客にとっては一般的に悪いことです)と、ソリューションをハッキングする人々からのコードによってのみ使用できます。

(2)署名者証明書のみ(秘密鍵へのアクセスなし)で、すでに生成された署名からCMS署名を作成することは可能ですか?

すでにPKCS#1署名がある場合は、非常にプリミティブなCMS署名コンテナーを作成できます。質問あなたが参照している証明書を持っている場合、どうすればPKCS#1をPKCS#7に変換できますか。

ただし、他の署名検証ソフトウェアと相互運用できるようにする場合は、そのような基本的な署名(操作の可能性が非常に高い)は拒否される可能性があります。

(3)上記の「変換」コードに問題がありますか?

サンプルのPKCS#1入力署名とサンプルのCMS結果も提供してください。さらに、@ owlsteadがコメントしたように、Sun内部クラスは使用しないでください。これらは、予告なしに変更、名前変更、または削除される可能性があります。(私は実際にshouldshallに置き換えたいと思います。)

(4)切り離された署名を検証するために使用できるツールを知っていますか?(私の結果を確認できるようにするため)

OpenSSLには検証ツールが含まれています。さらに、署名検証サービスを提供する多くのWebサービスがあります。それらのどれがあなたに適切であるかは、あなたの署名のPKIと法的環境に大きく依存します。

于 2013-02-27T11:47:27.627 に答える