Created
June 18, 2019 05:14
-
-
Save seraphy/c2473e822faecf364a46d27450737493 to your computer and use it in GitHub Desktop.
JavaのKeytoolを使ってDSA署名用のキーペアを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 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