Skip to content

Instantly share code, notes, and snippets.

@seraphy
Created June 18, 2019 05:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save seraphy/c2473e822faecf364a46d27450737493 to your computer and use it in GitHub Desktop.
Save seraphy/c2473e822faecf364a46d27450737493 to your computer and use it in GitHub Desktop.
JavaのKeytoolを使ってDSA署名用のキーペアをPkcs12として作成し、公開キーをderファイルとしてエクスポートし、そのキーを使った署名と検証を行うための実装例。
package jp.seraphyware.example.java8learn.security;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.Base64;
/**
* keytool -keystore server.p12 -storetype pkcs12 -keysize 2048 -genkeypair -validity 10000 -v
*
* でリソースディレクトリ上にpkcs12を生成する。
* aliasを指定しない場合はデフォルト名は mykey になる。
*
* keytool -keystore server.p12 -storetype pkcs12 -exportcert -alias mykey -file mykey.cer
*
* で mykeyのpublickeyを証明書にしてエクスポートする。
*/
public class Pkcs12DsaSignatureExample {
public static void main(String[] args) throws Exception {
String plainText = "署名する元の文書テキスト";
// 署名部
byte[] signature; // 署名
{
// リソース上のp12(pkcs12)ファイルをロードする
KeyStore keyStore = KeyStore.getInstance("pkcs12");
try (InputStream is = Pkcs12DsaSignatureExample.class.getResourceAsStream("/server.p12")) {
keyStore.load(is, "password".toCharArray());
}
// // ストアに格納されているaliasの一覧
// for(String name : Collections.list(keyStore.aliases())) {
// System.out.println("name=" + name);
// }
// mykeyという秘密キーを取得する
PrivateKey privateKey = (PrivateKey) keyStore.getKey("mykey", "password".toCharArray());
System.out.println("秘密キー=" + privateKey);
// // 証明書を取得する
// Certificate certificate = keyStore.getCertificate("mykey");
// System.out.println("certificate=" + certificate);
// keytoolでdsaキーを生成した場合は署名アルゴリズムには、SHA256withDSAを使う
Signature signer = Signature.getInstance("SHA256withDSA");
// プライベートキーの指定
signer.initSign(privateKey);
// 署名するメッセージ
signer.update(plainText.getBytes("UTF-8"));
// 署名を取得する
signature = signer.sign();
System.out.println("計算された署名=" + new String(Base64.getEncoder().encode(signature)));
}
// 署名の検証部
{
// リソース上の証明書を格納したderファイルを読み込む
X509Certificate cert;
CertificateFactory x509Factory = CertificateFactory.getInstance("X.509");
try (InputStream is = Pkcs12DsaSignatureExample.class.getResourceAsStream("/mykey.der")) {
cert = (X509Certificate) x509Factory.generateCertificate(is);
}
// System.out.println("[証明書]=" + cert);
// DSA署名アルゴリズム
Signature verifier = Signature.getInstance("SHA256withDSA");
// 公開キーを設定する
verifier.initVerify(cert.getPublicKey());
// 検証するメッセージ
verifier.update(plainText.getBytes("UTF-8"));
// 事前に計算された署名と一致するか検証する
boolean verified = verifier.verify(signature);
System.out.println("検証結果=" + verified);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment