Skip to content

Instantly share code, notes, and snippets.

@seraphy
Last active June 18, 2019 08:05
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/e84c418851627402d6c58fb2080658b5 to your computer and use it in GitHub Desktop.
Save seraphy/e84c418851627402d6c58fb2080658b5 to your computer and use it in GitHub Desktop.
JavaのKeytoolを使ってRSA署名用のキーペアを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 rsa.p12 -storetype pkcs12 -keysize 2048 -keyalg rsa -genkeypair -validity 10000 -v
*
* でリソースディレクトリ上にpkcs12を生成する。
* aliasを指定しない場合はデフォルト名は mykey になる。
*
* keytool -keystore rsa.p12 -storetype pkcs12 -exportcert -alias mykey -file rsa.der
*
* で mykeyのpublickeyを証明書にしてエクスポートする。
*/
public class Pkcs12RsaSignatureExample {
public static void main(String[] args) throws Exception {
String plainText = "署名する元の文書テキスト(RSA)";
// 署名部
byte[] signature; // 署名
{
// リソース上のp12(pkcs12)ファイルをロードする
KeyStore keyStore = KeyStore.getInstance("pkcs12");
try (InputStream is = Pkcs12DsaSignatureExample.class.getResourceAsStream("/rsa.p12")) {
keyStore.load(is, "password".toCharArray());
}
// mykeyという秘密キーを取得する
PrivateKey privateKey = (PrivateKey) keyStore.getKey("mykey", "password".toCharArray());
System.out.println("秘密キー=" + privateKey);
// keytoolでrsaキーを生成した場合は署名アルゴリズムには、SHA256withRSAを使う
Signature signer = Signature.getInstance("SHA256withRSA");
// プライベートキーの指定
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("/rsa.der")) {
cert = (X509Certificate) x509Factory.generateCertificate(is);
}
System.out.println("[証明書]=" + cert);
// RSA署名アルゴリズム
Signature verifier = Signature.getInstance("SHA256withRSA");
// 公開キーを設定する
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