Httpsは証明書(keytool)を生成し、Springbootで構成します

keytoolkeytoolキー(key)と証明書(certificates)を。keystoreという格納するJavaデータ証明書管理ツールです。

関連概念:HTTPS、認証局(CA)、証明書、デジタル署名、秘密鍵、公開鍵を理解するための1つの記事

キーストアには、次の2種類のデータがあります。

  1. キーエンティティ:秘密キーまたは秘密キーとペアの公開キー(非対称暗号化を使用)
  2. 信頼できる証明書エントリ:公開鍵のみを含む
  3. 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):パラメーターはファイルにエクスポートされるファイル名を指定しますmykeykeystorewindow xp
-alias
-keystore.keystore
-keyalg
-validity
-keysize
-storepasskeystore
-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インターフェースを要求します

おすすめ

転載: blog.csdn.net/zyx1260168395/article/details/112802464