記事ディレクトリ
keytool
keytool
キー(key)と証明書(certificates
)を。keystore
という格納するJavaデータ証明書管理ツールです。
キーストアには、次の2種類のデータがあります。
- キーエンティティ:秘密キーまたは秘密キーとペアの公開キー(非対称暗号化を使用)
- 信頼できる証明書エントリ:公開鍵のみを含む
ailas
(エイリアス):これに関連付けられているものはkeystore
それぞれ一意です。通常、alias
大文字と小文字は区別されません。alias
1.Keytoolはキーストアを生成します
keytoolの一般的なオプション:
-genkey
:ユーザーのホームディレクトリにデフォルトファイル ""を作成し、ユーザーの公開鍵、秘密鍵、および証明書を含むエイリアス.keystore
も生成mykey
します(生成場所が指定されていない場合、次のようなユーザーのシステムデフォルトディレクトリが存在します。システムの場合、システムのC:\ Documents and Settings \ UserName \ファイルに.keystoreという名前で生成されます):エイリアスを生成します:キーストアの名前を指定します(生成されるすべての種類の情報はファイル) :のアルゴリズムを指定しますキー(RSA、DSAなど(指定されていない場合、デフォルトではDSAが使用されます)):作成された証明書が有効な日数を指定します:キーの長さを指定します:キーストアのパスワード(情報)を指定します:エイリアスエントリのパスワードを指定します(秘密鍵パスワード):証明書の所有者情報を指定します。例:「CN =名と姓、OU =組織のユニット名、O =組織の名前、L =市または地域の名前、ST =州または州の名前、C =ユニットの2文字の国コード」:証明書を表示します情報。(keytool -list -v -keystoreはkeystore-storepassパスワードを指定します):キーストア内の証明書の詳細を表示します。:エイリアスで指定された証明書をファイルにエクスポートします。(keytool -export -aliasエクスポートするエイリアス-keystoreはキーストアを指定します-fileはエクスポートされた証明書の場所と証明書名を指定します-storepasspassword):パラメーターはファイルにエクスポートされるファイル名を指定しますmykey
keystore
window xp
-alias
-keystore
.keystore
-keyalg
-validity
-keysize
-storepass
keystore
-keypass
-dname
-list
-v
-export
-file
-delete
:キーストアのエントリを削除します。(keytool -delete -aliasは、削除するエイリアスを指定します。-keystoreは、keystore -storepassパスワードを指定します)
-printcert
:エクスポートされた証明書情報を表示します。(keytool -printcert -file yushan.crt)
-keypasswd
:キーストア内の指定されたエントリのパスワードを変更します。(変更するkeytool-keypasswd-aliasエイリアス-keypassoldpassword -new new password -storepass keystore password -keystore sage)
-storepasswd
:キーストアパスワードを変更します。(keytool -storepasswd -keystore e:\ yushan.keystore(パスワードを変更する必要があるキーストア)-storepass 123456(元のパスワード)-new yushan(新しいパスワード))
-import
:署名されたデジタル証明書をキーストアにインポートします。(keytool -import -aliasは、インポートされたエントリのエイリアスを指定します-keystoreは、keystore -fileにインポートされる証明書を指定します)
1.キーストアファイルを生成します
# keytool -genkeypair -alias 别名 -keypass 私钥密码 -keyalg 密钥算法 -keysize 密钥长度 -validity 证书有效期 -keystore 密钥库的生成路径、名称 -storepass 密钥库密码
> keytool -genkeypair -alias test -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore /Users/mac/Desktop/test.keystore -storepass 123456
您的名字与姓氏是什么?
[Unknown]: zyx
您的组织单位名称是什么?
[Unknown]: zyx
您的组织名称是什么?
[Unknown]: zyx
您所在的城市或区域名称是什么?
[Unknown]: bj
您所在的省/市/自治区名称是什么?
[Unknown]: bj
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=zyx, OU=zyx, O=zyx, L=bj, ST=bj, C=CN是否正确?
[否]: Y
2.キーストアファイルの詳細を表示する
# keytool -list -v -keystore keystore文件 -storepass 密码
keytool -list -v -keystore test.keystore -storepass 123456
3.キーストアから証明書(公開鍵)をエクスポートします
# keytool -export -alias 别名 -keystore keystore文件 -rfc -file 生成的证书名
keytool -export -alias test -keystore test.keystore -rfc -file test.cer
# .cer 转换成 .crt
openssl x509 -inform PEM -in test.cer -out test.crt
4.証明書の詳細を表示する
# keytool -printcert -file 证书名
keytool -printcert -file test.cer
5.キーストアから秘密鍵をエクスポートします
秘密鍵は非常に安全ではないため、証明書ストアからエクスポートできないことに注意することが重要です。秘密鍵または秘密鍵文字列が特に必要な場合は、プログラムでキーストアファイルから取得することのみを検討できます。
jdkコマンドはキーを生成できないため、keystore
コードbase64
てファイルから秘密キーでエンコードされたデータを読み取り、64文字の行としてフォーマットする必要があります。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import sun.misc.BASE64Encoder;
class SllKeyStore {
private File keystoreFile;
private String keyStoreType;
private char[] password;
private String alias;
private File exportedFile;
public static KeyPair getPrivateKey(KeyStore keystore, String alias, char[] password) {
try {
Key key = keystore.getKey(alias, password);
if (key instanceof PrivateKey) {
Certificate cert = keystore.getCertificate(alias);
PublicKey publicKey = cert.getPublicKey();
return new KeyPair(publicKey, (PrivateKey) key);
}
} catch (UnrecoverableKeyException e) {
} catch (NoSuchAlgorithmException e) {
} catch (KeyStoreException e) {
}
return null;
}
public void export() throws Exception {
KeyStore keystore = KeyStore.getInstance(keyStoreType);
BASE64Encoder encoder = new BASE64Encoder();
keystore.load(new FileInputStream(keystoreFile), password);
KeyPair keyPair = getPrivateKey(keystore, alias, password);
PrivateKey privateKey = keyPair.getPrivate();
String encoded = encoder.encode(privateKey.getEncoded());
encoded = encoded.replaceAll("\n", "");
//将密钥格式化为一行64个字符
StringBuilder sb = new StringBuilder(encoded);
int len = 64;
while (len < sb.length()) {
sb.insert(len, "\n");
len += 65;
}
FileWriter fw = new FileWriter(exportedFile);
fw.write("-----BEGIN RSA PRIVATE KEY-----\r\n");//私钥库文件必须以此开头,否则使用时会出错
System.out.println(sb + "\n");
fw.write(sb.toString());
fw.write("\r\n-----END RSA PRIVATE KEY-----");//私钥库文件必须以此结尾
fw.close();
}
public static void main(String args[]) throws Exception {
SllKeyStore export = new SllKeyStore();
// 指定自己的密钥库keystore文件
export.keystoreFile = new File("/Users/mac/Desktop/test.keystore");//读取官钥库keystore文件
export.keyStoreType = KeyStore.getDefaultType();
// 指定密钥库密码
String passwordString = "123456"; //密钥库口令
export.password = passwordString.toCharArray();
// 指定密钥库别名
export.alias = "test";//密钥库别名
// 指定要生成的私钥目录及文件名
export.exportedFile = new File("/Users/mac/Desktop/test.key");//生成的私钥文件
export.export();
}
}
次に、証明書形式の変換
# .key 转换成 .pem:
openssl rsa -in test.key -out test.pem
# .crt 转换成 .pem:
openssl x509 -in test.crt -out test.pem
# .cer 转换成 .crt
openssl x509 -inform PEM -in test.cer -out test.crt
3.Springbootはhttpsを使用します
生成されたkeystore
ファイル構成classpath
ファイルで構成します。application.yaml
server:
port: 8080
#开启https,配置跟证书一一对应
ssl:
#true表示开启HTTPS访问
enabled: true
#指定证书
key-store: classpath:test.keystore
#使用上面方法生成的格式为JKS
key-store-type: JKS
#默认为TLS,
protocol: TLS
#别名
key-alias: test
#私钥密码
key-password: 123456
#store文件密码
key-store-password: 123456
springbootのいくつかのSSL構成:
構成項目 | 説明する |
---|---|
server.ssl.ciphers = | サポートされているSSL暗号。 |
server.ssl.client-auth = | クライアント認証が必要か(「必要」)、必要か(「必要」)。トラストストアが必要です。 |
server.ssl.enabled=true |
SSLサポートを有効にします。 |
server.ssl.enabled-protocols = | SSLプロトコルが有効になっています。 |
server.ssl.key-alias= |
キーストア内のキーを識別するエイリアス。 |
server.ssl.key-password= |
キーストアのキーにアクセスするために使用されるパスワード。 |
server.ssl.key-store= |
SSL証明書を保持するキーストア(通常はjksファイル)へのパス。 |
server.ssl.key-store-password= |
キーストアへのアクセスに使用されるパスワード。 |
server.ssl.key-store-provider = | キーストレージのプロバイダー。 |
server.ssl.key-store-type = | キーストアのタイプ。(通常はjksファイル) |
server.ssl.protocol = TLS | 使用するSSLプロトコル。 |
server.ssl.trust-store = | SSL証明書を保持するトラストストア。 |
server.ssl.trust-store-password = | トラストストアにアクセスするためのパスワード。 |
server.ssl.trust-store-provider = | トラストストアのプロバイダー。 |
server.ssl.trust-store-type = | トラストストアの種類 |
HTTPプロトコルとHTTPSプロトコルの両方がサポートされています:SpringBootはHTTPSをサポートしています
4.Postmanはhttpsリクエストを送信します
Postmanは証明書を設定せずにhttpsリクエストにアクセスできますが、カスタム証明書の場合は、SSL検証をオフにする必要があります。
PostmanがSSL証明書を設定します:Postmanがhttpsインターフェースを要求します