6

私は最近、ドキュメントのデジタル署名を実行するドキュメントが最小限のプロジェクトを継承しましたが、変更要求を受け取り、少し当惑しました。

このアプリケーションは Java ベースであり、Java キーストア (JKS) を利用し、コマンド ライン操作として指定されたエイリアスの秘密鍵を使用して、入力ドキュメントにデジタル署名します。これはすべて私にはかなり簡単に思えますが、変更要求は私を混乱させました.

クライアントは、「Windows」キーストア (より具体的には、私が知る限り、個人証明書に関連する Windows-MY キーストア) を使用する機能を要求しました。ここで、私の最初の仮定は、クライアントが要求していることは単に不可能であるということです。これは、このキー ストアには証明書しか含まれておらず、ドキュメントの署名には使用できないためです。私は間違っていますか、それとも Windows-MY キーストアには公開証明書しか含まれませんか? これらの証明書のいずれかに秘密鍵が組み込まれることはないと思います。

残念ながら、コミュニケーションの問題がいくつかあるので、先に進む前に私の推論が正しいことを確認したいと思います.

私のケースを裏付ける証拠がいくつかあります(クライアントからの連絡):

Windows キー ストアの作成 (Java キーストアからのエクスポート) の手順は次のとおりです。

  1. RSA キーを生成する

     keytool -genkey -alias mykey -keyalg RSA -keystore my.jks -keysize 2048
    
  2. 上記のキーストアから証明書をエクスポートします。

     keytool -export -alias mykey -file mykey.crt -keystore my.jks
    
     Enter keystore password:  temp123
    
     Certificate stored in file <mykey.crt>
    
  3. 上記の証明書を Windows キーストアにインストールします。

を。「mykey.crt」をダブルクリックし、「証明書のインストール」をクリックします

b. 「すべての証明書を次のストアに配置する」ラジオ ボタンを選択し、「参照」ボタンをクリックして Windows 証明書ストアに追加します。c. WindowsMy ストアでこの証明書を確認してください。

私が間違っていない限り、keytool は実際の公開鍵と秘密鍵のペアではなく、証明書の種類のみを生成しますか?

質問に明確さが欠けていることをお詫びしますが、残念ながら、現時点で私が取り組まなければならないのはこれだけです。JavaまたはWindows固有の回答は役に立ちますが、基本原則の確認だけでもいただければ幸いです。

前もって感謝します

4

2 に答える 2

7

(個人) および(信頼されたルート証明機関) ストアに格納されている証明書とキーにアクセスするために使用できるプロバイダーに関するOracle のドキュメント [ 1 ] を参照してください。SunMSCAPIWindows-MYWindows-ROOT

少しのコード スニペットもありますが、これはあなたのニーズにかなり合っているようです。

   KeyStore ks = KeyStore.getInstance("Windows-MY");
    // Note: When a security manager is installed, 
    // the following call requires SecurityPermission 
    // "authProvider.SunMSCAPI".
    ks.load(null, null); 

    byte[] data = ...
    String alias = "myRSA";

    PrivateKey privKey = (PrivateKey) ks.getKey(alias, null);
    Certificate cert = ks.getCertificate(alias);

    Provider p = ks.getProvider();
    Signature sig = Signature.getInstance("SHA1withRSA", p);
    sig.initSign(privKey);
    sig.update(data);
    byte[] signature = sig.sign();
    System.out.println("\tGenerated signature...");
    sig.initVerify(cert);
    sig.update(data);
    if (sig.verify(signature)) {
       System.out.println("\tSignature verified!");
    }

要約: Windows-My ストアには証明書と秘密鍵が保持されており、どちらもプロバイダーを使用して Java から読み取ることができ、SunMSCAPIデジタル ドキュメントに署名するために使用できます。

于 2015-04-09T09:18:17.657 に答える
0

keytool で作成された (Java) キーストアの証明書とその秘密キーを使用して Windows にインポートできるようにするだけの場合は、PKCS12 形式 (PFX) にエクスポートします。(つまり、エクスポートするときは、パラメーター -storetype=pkcs12 を使用します)

于 2016-11-30T19:32:32.060 に答える