解析使用openssl和keytool创建密钥库的脚本

我想从Kafka客户端执行在没有TSL、有TSL或者TSL+客户端证书的环境下的测试。可能Bitnami的helm图表是最简单的选项,所以我希望能够用它来进行配置。

然而,我发现我对openssl和keytool了解不够深入,所以我想要通过理解在教程中使用的脚本中所使用的openssl和keytool命令来整理自己在做什么。

创建 CA 证书和 CA 的私钥

我已经写下了有关详细选项的说明,正在创建CA的私钥和自签名证书。在创建过程中,需要将以下信息填入证书,并在最开始的时候被询问证书密码,我已经输入了。常见名称通常会填写服务器的FQDN,但考虑到这是自签名证书,所以我会将自己的名字填入。

第70行

$ openssl req -new -x509 -keyout ca-private-key -out ca.crt -days 1000
Generating a RSA private key
.....................+++++
..............................................+++++
writing new private key to 'ca-private-key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:Washington
Locality Name (eg, city) []:Kirkland
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Simplearchitect
Organizational Unit Name (eg, section) []:Main
Common Name (e.g. server FQDN or YOUR name) []:tsushi
Email Address []:MY_EMAIL_HERE

req: サブコマンド。PKCS#10 の証明書リクエストと、証明書を作成するユーティリティ

-new: 証明書のリクエストを作成する。-key が指定されていなければ、RSA の private keyを作成する。

-x509: 証明書リクエストの代わりに、自己署名証明書(SelfSignedCertificate) を出力する

-keyout: 新しく作られた private key を出力する

-out: 標準出力をファイルに出力する。この場合、-x509の項目が指定されているので自己署名証明書が出力される

-days: 出力される証明書の有効日数。デフォルトは30 日

请注意,这是通过openssl req命令执行的操作。

输出

$ ls
ca-private-key  ca.crt
``

# 2. Ca証明書 を trust keystore に格納
1. で作成した、CA用の 証明書を Keystore に入れる。`openssl``keytool` はやれることがオーバーラップしてややこしいが、`keytool` しかできないことに、KeyStoreの作成がある。KeyStore は証明書をエイリアスをつけて格納できたり、取り出せたりするキーストアだ。Java のエコシステムでよく使われる。Kafaも、Javaで作られているので、これを参照するのだと思う。ただ、他の言語がクライアントの場合は、KeyStoreを使わない場合が多いと思うので、理屈を知っておく必要がある。実行時に1.で聞かれたパスワードを聞かれる

_Line 92_

```bash
keytool -keystore kafka.truststore.jks -alias CARoot -import -file ca.crt 

-import: サブコマンド importcertと同様。証明書か証明書チェーン (PKCS#7 reply か X.509証明書)を読み込んでキーストアに入れる。

-keystore: キーストア。なければ作成される。

-alias: ストアされるエンテイティ(証明書)のエイリアス

-file: 読み込む証明書

产出

有一个新的密钥库被创建。

$ ls
ca-private-key  ca.crt  kafka.truststore.jks

3. 生成密钥对和证书,并存储到密钥库中。

这里所说的证书,是指被CA证书签名后将要用于存储于服务器等用途的证书。

第144行

keytool -keystore kafka.keystore.jks -alias localhost -validity 1000 -genkey -keyalg RSA
Enter keystore password:  
Re-enter new password: 
What is your first and last name?
  [Unknown]:  Tsuyoshi Ushio
What is the name of your organizational unit?

What is the name of your organization?

What is the name of your City or Locality?

What is the name of your State or Province?

What is the two-letter country code for this unit?

Is CN=Tsuyoshi Ushio, OU=Simplearchitect, O=Main, L=Kirkland, ST=Washington, C=US correct?

-genkey: サブコマンド。 -genkeypair と同様。Key Pair (Private/Public key) と、X.509 の自己証明書が、証明書チェーンとしてストアされる。

-validity: 有効日数

-keyalg: キーアルゴリズム名

输出

$ ls
ca-private-key  ca.crt  kafka.keystore.jks  kafka.truststore.jks

从密钥库中提取CA证书。

第157行

$ keytool -keystore kafka.truststore.jks -export -alias CARoot -rfc -file ca.crt.exported
Enter keystore password:  
Certificate stored in file <ca.crt.exported>

由于来自KeyStore的CA证书是相同的,只是空格不同,所以在diff命令后加上-b选项来比较。

$ls
ca-private-key  ca.crt  ca.crt.exported  kafka.keystore.jks  kafka.truststore.jks
$diff ca.crt ca.crt.exported -b

获取证书签名请求

我们将对刚才在步骤3创建的自签名证书进行签名请求。

第163行

$ keytool -keystore kafka.keystore.jks -alias localhost -certreq -file cert-sign-request

产出

$ls
ca-private-key  ca.crt  ca.crt.exported  cert-sign-request  kafka.keystore.jks  kafka.truststore.jks

用CA私钥对证书进行签名

第170行

$ openssl x509 -req -CA ca.crt -CAkey ca-private-key -in cert-sign-request -out signed.crt -days 1000 -CAcreateserial
Signature ok
subject=C = US, ST = Washington, L = Kirkland, O = Main, OU = Simplearchitect, CN = Tsuyoshi Ushio
Getting CA Private Key
Enter pass phrase for ca-private-key:

x509: 証明書のサインと表示のためのユーティリティ

-out: 標準出力から読み込みを行う

-CA: CA 証明書を指定する

-CaKey: CA の Private Key を指定する

-req: デフォルトでは、標準入力から証明書を読み込むが、代わりにリクエストを読み込む

-CAcreateserial: CAシリアルナンバーファイルが出力される(使用が推奨される)

产出

输出了被签名的证书。此外,CA的序列文件 ca.srl 也已输出。

ca-private-key  ca.crt  ca.crt.exported  ca.srl  cert-sign-request  kafka.keystore.jks  kafka.truststore.jks  signed.crt

把 CA 证书放入密钥库中

第180行

$ keytool -keystore kafka.keystore.jks -alias CARoot -import -file ca.crt

在脚本中,接下来将删除CA证书。因为它可以从密钥库中获取。

将签署的证书存储到密钥工具中

第188行

keytool -keystore kafka.keystore.jks -alias localhost -import -file signed.crt

总结

脚本可以瞬间生成,由于未能对keystore进行了解,我一度不知该如何做才好。但是,经过全部分析后,我最终理解了keytool和openssl命令,包括背景知识。

资源

除了下面的内容之外,您也可以通过运行命令“man openssl <子命令>”来找到一个很好的手册。

keytool 古いので古い名前が参照されている(e.g. -import)
keytool common options
A Java “keytool genkey” example

openssl コマンドの使い方 かなり良い openssl の使い方
Java “keytool import”: How to import a certificate into a keystore file

广告
将在 10 秒后关闭
bannerAds