Last active
June 18, 2019 08:05
-
-
Save seraphy/e84c418851627402d6c58fb2080658b5 to your computer and use it in GitHub Desktop.
JavaのKeytoolを使ってRSA署名用のキーペアをPkcs12として作成し、公開キーをderファイルとしてエクスポートし、そのキーを使った署名と検証を行うための実装例。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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