私は、ログインURLの一部に認証が必要なサーバーで作業しています。この方式は、(マニュアルで推奨されているように)動作する方法はopensslを使用してJava Signature signメソッドをエミュレートする方法は?
- 公開鍵/秘密鍵のペアは、証明書がために生成される
- (Javaキーストアでそれらを作成する)は、Java JDKのkeytoolを使用して生成されるということですJava JDK keytoolを使用する鍵ペア
- 証明書がサーバーにインストールされています。
クライアントにログオンする(私のコード)
- 平文トークン文字列を生成し
- はSHA1を使用して秘密鍵で平文トークン文字列に署名し、DSA
- は、署名されたトークン文字列が含まれますログインURLに
のJava keytoolがキーストアからプライベートキーをエクスポートするためのメカニズムを提供していませんが、別に私は、キーストアからプライベートキーを抽出し、それをファイルに保存するためのJavaコードがある - How do I list/export private keys from a keystore?に基づいています。
これは、クライアントがJavaを使用して署名を行う場合、次のようなコードですべて動作します。
String plaintext = "This is a sample plaintext token string";
Signature instance = Signature.getInstance("SHA1withDSA");
instance.initSign(privateKey);
instance.update((plaintext).getBytes());
byte[] signature = instance.sign();
クライアントがPHPを使用して署名を行うときにも、次のようなコードで動作します。 。ここで私は今、顧客はbashスクリプトとOpenSSLを使用してログインURLを構築するために望んでいる状況があるが、秘密鍵は
$privateKey = openssl_pkey_get_private("file://$keyfile", $keystorePassword);
openssl_sign($paramsEncoded, $signature, $privateKey, OPENSSL_ALGO_DSS1))
] PHPでのJavaキーストアファイルから取得された - それは動作しません。そのコードの私の最も最近のバージョンは、SHA1メッセージダイジェストとDSAサインを行う次のようになります。しかし、サーバーはトークンを拒否します。
echo $tokenString | openssl dgst -sha1 > tokendigest
openssl dgst -dss1 -passin pass:$storePassword -sign $privateKeyFile > tokensigned
私は、Java署名signメソッドがダイジェストに署名していないことを示唆しているのではなく、ダイジェストアルゴリズムIDとダイジェストの連結に署名した(Using SHA1 and RSA with java.security.Signature vs. MessageDigest and Cipher)この記事に出くわしました。ポスト内のコードをステップ実行すると、(SHA1の場合)ダイジェストの先頭にバイト48 33 48 9 6 5 43 14 3 2 26 5 0 4 20
がある必要があります。しかし、それを追加した後でさえ、opensllを取得してサーバーに受け入れられる署名付きトークンを生成することはできません。
opensslを使用してJava Signature signメソッドをエミュレートする方法を知っている人はいますか?
「トークンログインでエラーが発生しました」という結果が表示されました。私はさらにopenssl verifyを追加しました(下のように) - opensslがVerified OKを報告しました。 'echo $ tokenString | openssl dgst -dss1 -passin pass:$ storePassword -sign $ privateKeyFile> $ signedTokenOpensslFile echo $ tokenString | openssl dgst -dss1 -verify $ publicKeyFile -signature $ signedTokenOpensslFile' – Torid
@ Torid:あなたの問題は、 'echo'が文字列に追加する余分な改行かもしれません。 'echo -n'を試してください。 –
はい。 'echo -n'はそれを修正しました。私はstackoverflow.comを愛する - それは私が少しばかと感じるようになっても。ありがとう! – Torid