目录
数字证书 CA (Certificate Authority)概念及原理
4. 在上面的提到的公钥,是验证阶段使用的重要验证依据,怎么保证拿到的公钥没有被篡改呢?
5. 什么是keystore文件?保存证书和密钥对的存储库,在keystore里,包含两种数据:
6. 证书标准X.509 - 这是一种证书标准,主要定义了证书中应该包含哪些内容.其详情可以参考RFC5280,SSL使用的就是这种证书标准.
7. 编码格式同样的X.509证书,有不同的编码格式,目前有以下两种编码格式.
第二步,用keytool转化keystore文件为PKCS12格式的文件。
第四步,创建证书签名请求certificate request。
Hyper Text Transfer Protocol超文本传输协议,现在互联网世界里,从你的电脑访问一个网站,你所看到的浏览器显示的内容,就是通过HTTP获取来的。通俗地讲,HTTP可以理解为网络世界里约定俗成的规则,通过这组规则,可以把远端服务器(网站架设在此)上的网页内容,像文字、图片、视频等杂七杂八的东西,传输到终端用户(你的浏览器上)。当然,当中还涉及很多其他协议。这就好比你在高速上行驶必须遵守高速公路行驶的规则一样,只有这样你才能顺利到达目的地。
图1
Hyper Text Transfer Protocol Secure,是以安全为目标的HTTP通道(也可以说HTTP over TLS,HTTP over SSL或HTTP Secure)是一种网络安全传输协议。因为HTTP是以明文(clear text)在网络上传输的,意味着在网络上传输的什么内容想看的人都可以轻易看到(就像开着敞篷跑车,路人随便可以看到车上坐着谁、在干什么等等,没有隐私),非常不安全,想想,如果你访问一个网站,需要输入你的用户名、密码,甚至你的信用卡号、安全码等,瑟瑟发抖不?所以HTTPS就派上用场了,HTTPS确保传输途中的安全,保证内容不被窃听、篡改、丢失等,因为HTTPS会把传输的内容通过指定的算法加密,并且在传输内容之前还要网站提供“证据”自证清白,这样确保你的电脑要连的是真实可靠的网站而不是冒牌货,并且传输过程中内容加密。
图2
图3
Secure Sockets Layer安全套接层,通常直接理解为protocol协议,是HTTPS在HTTP的基础上对传输内容进行加密,这一过程叫SSL加密。SSL协议位于TCP/IP协议与各种应用层协议比如HTTPS之间,为数据通讯提供安全支持。
Transport Layer Security传输层安全(协议),是业界标准最新的加密协议,属于SSL的后任,所以干的话跟SSL类似,包括认证server和client以及加密传输。
图4
通过前面名词的解释,已经明白,使用HTTPS无外乎有两个好处:
以单向的https验证流程步骤为例,请看下面的工作流程图。
图5
证书验证阶段:
数据传输阶段:
简单的理解就是网络世界的身份证,这个发行机关就是数字认证中心,它负责证书的发放,管理和废除。证书的作用就是检查持证人身份的合法性,并签发证书,以防止证书被伪造或者篡改,并对证书和密钥进行管理。
数字证书的格式遵循X.509标准。这个标准规范了公开密钥认证、证书吊销列表、授权证书、证书路径验证算法等。
证书的内容包括:
> 电子签证机关的信息、
> 公钥用户信息、
> 公钥、
> 有效期,
> 权威机构的签字等等
数字证书一般有两种发行方式:
> 交由受信任的第三方证书颁发机构签名
> 自制CA证书并用其签名,一般制作证书会使用OpenSSL和Keytool工具
制作证书的过程如下:
> 制作消息摘要
> 形成数字签名
> 生成数字证书
图6
用户鉴别服务器端的证书的真伪,可以先对该数字证书的申请者信息用hash算法得到哈希值h1, 然后使用CA证书的公钥对该证书上的签字进行解密得到原来的哈希值h2, 如果h1==h2, 则表示证书有效。
图7
简单地说,对称加密就是加密和解密使用的是同一个密钥,流行的对称加密算法有DES,Triple-DES,RC2和RC4。而非对称加密是双方必须协调一对密钥,一个是公钥,另一个是私钥。
用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据,只有对应的私钥才能解密。非对称加密算法有:RSA,DSA,DH。
使用对称密钥的好处是速度快,使用非对称密钥的好处是可以使得传输的内容不能被破解,
因为就算你拦截到了数据,但是没有对方的私钥,也是不能破解内容的。因此常用非对称加密建立的安全信道,然后进行共享密钥(图中的随机数)的分享,完成后,使用对称加密对传输数据进行加密解密,如此形成混合加密系统。
因为在数据传输过程中存在“中间人攻击”问题。CA中心为每个使用公钥的用户发放一个数字证书,数字证书的作用是证明证书中列出的用户合法拥有证书中列出的公钥。用户获得证书的过程是,他先向 CA 提出申请。在 CA 判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者。其他用户想鉴别这个证书的真伪,他就用 CA 的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。
使用数字证书+签名的方式,使用第三方的信任机关发行的数字证书CA是证明身份的重要凭证,同时为了防止数字证书被篡改,再加上数字签名的方式,具体实现请看下面讲解。
但是,keytool是不让从keystore文件里提取出来private key和public key的。如有需要,我们可以把keytool产生的keystore文件,转化为OpenSSL能读的PKCS12格式的文件。从PKCS12文件中再进一步提取private key和public key。具体参考后面的实例。查看keystore的命令是keytool -list -v -keystore <keystore file>
查看PEM格式证书的信息: openssl x509 -in certificate.pem -text -noout
Apache和NGINX服务器偏向于使用这种编码格式.
查看DER格式证书的信息: openssl x509 -in certificate.der -inform der -text -noout
下面详细讲讲使用keytool和openssl来产生key和certificate的实现过程。本例是Apache web服务器为例,RHEL安装Apache web服务也比较简单,一个命令搞定。
然后是keytool和OpenSSL工具。这两个工具在RHEL里可以也用yum来安装。我的RHEL 8.4环境下两个yum命令即完成httpd,keytool和openssl的安装。
- yum install httpd mod_ssl -y
- yum install -y java-1.8.0-openjdk-devel-1:1.8.0.212.b04-1.el8_0.x86_64 openssl-devel-1:1.1.1k-6.el8_5.x86_64
下面详解每一步过程。先创建目录/ssltest/CA保存CA相关文件, /ssltest/Keys保存服务器相关文件。
里面包括密钥对和证书。这步即是制作消息摘要message digests。
-genkeypair 产生一个keystore文件
-alias One 指定一个别名给要添加的条目,因为一个keystore文件可以有多个条目,这样就不会混乱。
-keyalg RSA 指定密钥的加密算法
-sigalg 指定签名的加密算法
-keystore
KeyStore.jks指定即将生成的keystore文件的文件名,一般 以.jks为后缀方便识别
-dname "CN=***,OU=***,O=***,L=BJ,C=China"
指定keystore的专有名,CN指CommonName,OU指OrganizationalUnit,O指Organization,L指Locality,C指CountryName。如果不指定,则会在提示中逐个输入。
-keypass Letmein123 指定key password,这个password用于查看/更新keystore文件,但如要用keystore去签名则需要下面的storepass
-storepass Letmein123 指定store password用于签名
这里设置的keypass和storepass都建议用记事本记下来,方便后面使用。
- [root@myserver1 Keys]# keytool -genkeypair -alias One -keystore KeyStore.jks -keyalg RSA -sigalg SHA1withRSA
- Enter keystore password:
- Re-enter new password:
- What is your first and last name?
- [Unknown]: San Zhang
- What is the name of your organizational unit?
- [Unknown]: Feihongtaxue
- What is the name of your organization?
- [Unknown]: FHTX
- What is the name of your City or Locality?
- [Unknown]: Beijing
- What is the name of your State or Province?
- [Unknown]: HD
- What is the two-letter country code for this unit?
- [Unknown]: CN
- Is CN=San Zhang, OU=Feihongtaxue, O=FHTX, L=Beijing, ST=HD, C=CN correct?
- [no]: yes
-
- Enter key password for <One>
- (RETURN if same as keystore password):
-
- Warning:
- The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore KeyStore.jks -destkeystore KeyStore.jks -deststoretype pkcs12".
这样,一个包含密钥对和证书的keypair就生成了,保存在KeyStore.jks文件中。可以用下面的命令来查看。
- [root@myserver1 Keys]# keytool -list -v -keystore KeyStore.jks
- Enter keystore password:
- Keystore type: jks
- Keystore provider: SUN
-
- Your keystore contains 1 entry
-
- Alias name: one
- Creation date: Jul 4, 2022
- Entry type: PrivateKeyEntry
- Certificate chain length: 1
- Certificate[1]:
- Owner: CN=San Zhang, OU=Feihongtaxue, O=FHTX, L=Beijing, ST=HD, C=CN
- Issuer: CN=San Zhang, OU=Feihongtaxue, O=FHTX, L=Beijing, ST=HD, C=CN
- Serial number: 652d36e7
- Valid from: Mon Jul 04 00:34:05 PDT 2022 until: Sun Oct 02 00:34:05 PDT 2022
- Certificate fingerprints:
- MD5: 8C:01:FE:7E:BB:7B:B8:68:05:FA:6E:D4:21:62:7E:F4
- SHA1: 00:35:CD:E8:12:88:DC:82:9E:22:EE:9E:96:10:9E:3A:A7:4B:10:DF
- SHA256: 75:1B:E2:15:05:FE:52:06:B8:AF:CD:EA:C6:BF:A6:27:A4:7D:A8:9D:A8:FB:B9:F3:AA:5C:9A:2D:47:F3:C2:6F
- Signature algorithm name: SHA1withRSA
- Subject Public Key Algorithm: 2048-bit RSA key
- Version: 3
-
- Extensions:
-
- #1: ObjectId: 2.5.29.14 Criticality=false
- SubjectKeyIdentifier [
- KeyIdentifier [
- 0000: 72 DE 17 CE 43 EB E3 CB 7F 4B 08 4A 04 DC F9 22 r...C....K.J..."
- 0010: 39 1C B6 6A 9..j
- ]
- ]
- *******************************************
- *******************************************
- Warning:
- The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore KeyStore.jks -destkeystore KeyStore.jks -deststoretype pkcs12".
如果想查看具体的证书,可以指定-rfc参数。
- [root@myserver1 Keys]# keytool -list -keystore KeyStore.jks -rfc
- Enter keystore password:
- Keystore type: jks
- Keystore provider: SUN
-
- Your keystore contains 1 entry
-
- Alias name: one
- Creation date: Jul 4, 2022
- Entry type: PrivateKeyEntry
- Certificate chain length: 1
- Certificate[1]:
- -----BEGIN CERTIFICATE-----
- MIIDazCCAlOgAwIBAgIEZS025zANBgkqhkiG9w0BAQUFADBmMQswCQYDVQQGEwJD
- TjELMAkGA1UECBMCSEQxEDAOBgNVBAcTB0JlaWppbmcxDTALBgNVBAoTBEZIVFgx
- FTATBgNVBAsTDEZlaWhvbmd0YXh1ZTESMBAGA1UEAxMJU2FuIFpoYW5nMB4XDTIy
- MDcwNDA3MzQwNVoXDTIyMTAwMjA3MzQwNVowZjELMAkGA1UEBhMCQ04xCzAJBgNV
- BAgTAkhEMRAwDgYDVQQHEwdCZWlqaW5nMQ0wCwYDVQQKEwRGSFRYMRUwEwYDVQQL
- EwxGZWlob25ndGF4dWUxEjAQBgNVBAMTCVNhbiBaaGFuZzCCASIwDQYJKoZIhvcN
- AQEBBQADggEPADCCAQoCggEBAJLP/AmAT/c80yMAFwpCAot1xKltUPa97C/HI29r
- dZbwTWKPbUw/4LhMqPBogw7iPM8mW/GCympwk9KVC6kepf0XFKLObGb6Us1ECX1V
- zb/+RRXFZtWvoo3f11MhnshZdVi4rB3q23E6ihtw+TUdmynSHM6Zs+BqQ2by45bd
- 2cdiREoyGPXDFMYek4OkIHZxKzsK9qtSJXxWJ5jAwVx+AwBxWnW7so+d9zURExil
- GxLQNYLasU9NParwoMGdB/67t9XtsOnnHak98s9E7gUWxEsEZi8LWXABxusxQBwQ
- /9gsh6S7wd+G1QckTlcCXowQC9PKJPw16aQg9NkVcUY2pqECAwEAAaMhMB8wHQYD
- VR0OBBYEFHLeF85D6+PLf0sISgTc+SI5HLZqMA0GCSqGSIb3DQEBBQUAA4IBAQBu
- rquyez2F1woDZ6ni/yy7Pvs2FhWaD6kRHHI4P/ATU3pNfxtRibwkRMobvyeE6XQb
- UwZOnQi3fcNwVi7wKH0KADZKyZScAReZjCWPgs9L5ihFQkyuEn18cklJTT9LiQss
- w56OCcXdDX+4BcPVAsedEwtK1vCrw1cok4YDXB7sFunAwqDA6D8ivGN1/JTVyqC9
- 1BTxPXRrku7I9NR/OTMit837UiXqChzl44/EkTP03d5npceMMVx7BEB1Yfei6JOG
- dYdCqzUCw/XCHbPQv41IUap/6N1WH+4SSJMRQoMHT1nDMCBSPAiJhMft0rUQnpKw
- Z6AbEjAvwKt+vWlREvzs
- -----END CERTIFICATE-----
-
- *******************************************
- *******************************************
-
- Warning:
- The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore KeyStore.jks -destkeystore KeyStore.jks -deststoretype pkcs12".
这样做的目的是,我们需要提取出来private key,因为在/etc/httpd/conf.d/ssl.conf中需要指定证书的private key以及证书本身,分别是SSLCertificateKeyFile和SSLCertificateFile两个参数。
-importkeystore 从keystore文件导入条目以生成另外一个keystore文件
-srckeystore KeyStore.jks 指定源keystore文件
-srcstorepass Letmein123 指定源keystore文件的storepass
-srckeypass Letmein123 指定源keystore文件的keypass
-srcalias One 指定源keystore文件里条目的别名
-destalias One 指定目标keystore文件里条目的别名
-destkeystore KeyStore.p12 指定目标keystore文件的文件名,因为下面指定keystore类别为PKCS12,故以.p12为后缀方便识别
-deststoretype PKCS12 指定目标keystore的类别,可以是JKS, JCEKS, PKCS12, PKCS11 and DKS.
-deststorepass Letmein123 指定目标keystore的storepass
-destkeypass Letmein123 指定目标keystore的keypass
-ext 指定X.509扩展名
pkcs12 指定openssl去创建或解析PKCS#12类型的文件;默认是解析,如果要创建,后跟-export选项。
-in KeyStore.p12 指定输入的PKCS12文件,即上面创建的identity.p12
-nodes no des,指定不加密私钥
-nocerts no certs,指定不输出证书
-out private_key.pem 指定输出的私钥的文件名
- [root@myserver1 Keys]# keytool -importkeystore -srckeystore KeyStore.jks -srcstorepass Letmein123 -srckeypass Letmein123 -srcalias One -destalias One -destkeystore KeyStore.p12 -deststoretype PKCS12 -deststorepass Letmein123 -destkeypass Letmein123
- Importing keystore KeyStore.jks to KeyStore.p12...
-
- [root@myserver1 Keys]# openssl pkcs12 -in KeyStore.p12 -nodes -nocerts -out private_key.pem
- Enter Import Password:
- [root@myserver1 Keys]# ls -lrt
- total 24
- -rw-r--r-- 1 root root 2229 Jul 4 00:34 KeyStore.jks
- -rw-r--r-- 1 root root 879 Jul 4 00:40 one.cer
- -rw-r--r-- 1 root root 1089 Jul 4 00:44 one.csr
- -rw-r--r-- 1 root root 1261 Jul 4 01:36 serverSignedByCA.cer
- -rw-r--r-- 1 root root 2561 Jul 4 07:19 KeyStore.p12
- -rw------- 1 root root 1844 Jul 4 07:21 private_key.pem
- [root@myserver1 Keys]# cat private_key.pem
- Bag Attributes
- friendlyName: one
- localKeyID: 54 69 6D 65 20 31 36 35 36 39 34 34 33 39 33 37 31 33
- Key Attributes: <No Attributes>
- -----BEGIN PRIVATE KEY-----
- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCSz/wJgE/3PNMj
- ABcKQgKLdcSpbVD2vewvxyNva3WW8E1ij21MP+C4TKjwaIMO4jzPJlvxgspqcJPS
- lQupHqX9FxSizmxm+lLNRAl9Vc2//kUVxWbVr6KN39dTIZ7IWXVYuKwd6ttxOoob
- cPk1HZsp0hzOmbPgakNm8uOW3dnHYkRKMhj1wxTGHpODpCB2cSs7CvarUiV8VieY
- wMFcfgMAcVp1u7KPnfc1ERMYpRsS0DWC2rFPTT2q8KDBnQf+u7fV7bDp5x2pPfLP
- RO4FFsRLBGYvC1lwAcbrMUAcEP/YLIeku8HfhtUHJE5XAl6MEAvTyiT8NemkIPTZ
- FXFGNqahAgMBAAECggEADZq6V0MNpfJ7+j1S5T9yruut2qlnnEXDMjY44WVK0z7X
- XO+/iBZPQ6TO7uAwbNuoGOYMFRgym6Rs/lGTcAuIBCj0X5XTU8OUkrLgUj32P/lW
- +4p8WgbZgF4ivPBbn2MyzZLnWCpgRWDQVXSlkzd4Hmr7AmYZ1gzizBJr5poOSTx8
- nodg3RvJg6qyJSxoX8mMqMfhq+xBNCpxVLncJfH2qOSiUAKmb3M88Vl3veW76u29
- Qck3MiXVLj+jjdDzw/9f5TxgY12voGsK4/wf3x8dbDxXEd7aID8w3YKqJd0O/yFb
- iijfg7GTZ+lLT+mpLhdt3Yk5Vhoi9ZTaRxSzAtURJQKBgQDfdZT6VAAxuFmpuMUV
- 1YAe35tQ8ochTwpToOrqL4q8yv/Hm5vAip81Y1WMi8+r1gmgasKxN5IcO6CFOVmo
- +LBAsqOPG4GtV8jeQhoOaVAkvS0TROeDwXHOorD+uqqaFpuhT3ifBNVocNvQJiwq
- bn0wKGFn6r+0gseY+NHGOntzLwKBgQCoMQ6fj1AIosYkxWj84NmXiPtIp44kEdOr
- MsIeK7keYSUOSxk5YbSB+UFm9ifv8nkYjLagODr4HuQeKzVaAmnk9wRBxQj0IPPI
- FVLXYM2j1sb0kMb4VACvM3xvDYwhixagIAv4dz+azylKKg0VeussDu4z7ZxwPeUl
- lbH7Es9PLwKBgQCJIiSiF0jjOmo0IQM6KgLtb3Zmj9/jzhjdR6TCwRhYUg/0VIeZ
- +rhH0EUg8nAo2TqhKsN+dEcDcohJGe/vJWcs3TRIz62eToAj/db1vyWC1mHCMIgP
- sHiCQg9y0+V8mKE7toSkuhepd5E+RR7Xj2TeV/mnB0ZMpfGN7Cz4hM1b2wKBgEhW
- iR6RSe/c6nHIQiZ5IrztGn6eKiFTVYGNXDYTwhPR3lkubZPjdPpt1PZOqtClrfWk
- F6wDY0FyL9TV6qVi4l6q6zbKYtZ1EcSdfzrJFMkByCJJ3nnRz1WLRFqTLhEDPGD0
- R5G+4ClaLj0KpwP1EQ6rAUJuUNlplZO7tYfyCB3bAoGBALE0CoofxBhBT1ZIqrto
- V8O7PcdyApnRJFDGy5UMk4TYOj88xDoDNuiAA6Lk45GPpfThjQQs0pAjv/Dm5Wua
- 4I1QgU7wSE2TOeaPFY9v3h2brfhBJ7WQLNL5g/KPnHWxGUtY5GhlJbLV/MNiRts8
- cnJ6IGvazqj0TxZh/oRekqwX
- -----END PRIVATE KEY-----
如果需要,也使用openssl提取公钥(嵌在私钥里),用rsa命令。
rsa 指定使用rsa来转化rsa key的格式
-in private_key.pem 指定私钥文件,公钥将从中提取
-pubout 指定输出公钥(默认输出私钥)
-out pubkey.pem 指定输出的公钥存在哪个文件
- [root@myserver1 Keys]# openssl rsa -in private_key.pem -pubout -out pubkey.pem
- writing RSA key
- [root@myserver1 Keys]# cat pubkey.pem
- -----BEGIN PUBLIC KEY-----
- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAks/8CYBP9zzTIwAXCkIC
- i3XEqW1Q9r3sL8cjb2t1lvBNYo9tTD/guEyo8GiDDuI8zyZb8YLKanCT0pULqR6l
- /RcUos5sZvpSzUQJfVXNv/5FFcVm1a+ijd/XUyGeyFl1WLisHerbcTqKG3D5NR2b
- KdIczpmz4GpDZvLjlt3Zx2JESjIY9cMUxh6Tg6QgdnErOwr2q1IlfFYnmMDBXH4D
- AHFadbuyj533NRETGKUbEtA1gtqxT009qvCgwZ0H/ru31e2w6ecdqT3yz0TuBRbE
- SwRmLwtZcAHG6zFAHBD/2CyHpLvB34bVByROVwJejBAL08ok/DXppCD02RVxRjam
- oQIDAQAB
- -----END PUBLIC KEY-----
如果需要,也可以使用openssl提取证书。
pkcs12 指明提取证书的命令
-in KeyStore.p12 指定输入的PKCS12文件,即上面创建的identity.p12
-nokeys 指定不输出私钥
-out cert.pem 指定输出的证书的文件名
- [root@myserver1 Keys]# openssl pkcs12 -in KeyStore.p12 -nokeys -out cert.pem
- Enter Import Password:
- [root@myserver1 Keys]# cat cert.pem
- Bag Attributes
- friendlyName: one
- localKeyID: 54 69 6D 65 20 31 36 35 36 39 34 34 33 39 33 37 31 33
- subject=C = CN, ST = HD, L = Beijing, O = FHTX, OU = Feihongtaxue, CN = San Zhang
-
- issuer=C = CN, ST = HD, L = Beijing, O = FHTX, OU = Feihongtaxue, CN = San Zhang
-
- -----BEGIN CERTIFICATE-----
- MIIDazCCAlOgAwIBAgIEZS025zANBgkqhkiG9w0BAQUFADBmMQswCQYDVQQGEwJD
- TjELMAkGA1UECBMCSEQxEDAOBgNVBAcTB0JlaWppbmcxDTALBgNVBAoTBEZIVFgx
- FTATBgNVBAsTDEZlaWhvbmd0YXh1ZTESMBAGA1UEAxMJU2FuIFpoYW5nMB4XDTIy
- MDcwNDA3MzQwNVoXDTIyMTAwMjA3MzQwNVowZjELMAkGA1UEBhMCQ04xCzAJBgNV
- BAgTAkhEMRAwDgYDVQQHEwdCZWlqaW5nMQ0wCwYDVQQKEwRGSFRYMRUwEwYDVQQL
- EwxGZWlob25ndGF4dWUxEjAQBgNVBAMTCVNhbiBaaGFuZzCCASIwDQYJKoZIhvcN
- AQEBBQADggEPADCCAQoCggEBAJLP/AmAT/c80yMAFwpCAot1xKltUPa97C/HI29r
- dZbwTWKPbUw/4LhMqPBogw7iPM8mW/GCympwk9KVC6kepf0XFKLObGb6Us1ECX1V
- zb/+RRXFZtWvoo3f11MhnshZdVi4rB3q23E6ihtw+TUdmynSHM6Zs+BqQ2by45bd
- 2cdiREoyGPXDFMYek4OkIHZxKzsK9qtSJXxWJ5jAwVx+AwBxWnW7so+d9zURExil
- GxLQNYLasU9NParwoMGdB/67t9XtsOnnHak98s9E7gUWxEsEZi8LWXABxusxQBwQ
- /9gsh6S7wd+G1QckTlcCXowQC9PKJPw16aQg9NkVcUY2pqECAwEAAaMhMB8wHQYD
- VR0OBBYEFHLeF85D6+PLf0sISgTc+SI5HLZqMA0GCSqGSIb3DQEBBQUAA4IBAQBu
- rquyez2F1woDZ6ni/yy7Pvs2FhWaD6kRHHI4P/ATU3pNfxtRibwkRMobvyeE6XQb
- UwZOnQi3fcNwVi7wKH0KADZKyZScAReZjCWPgs9L5ihFQkyuEn18cklJTT9LiQss
- w56OCcXdDX+4BcPVAsedEwtK1vCrw1cok4YDXB7sFunAwqDA6D8ivGN1/JTVyqC9
- 1BTxPXRrku7I9NR/OTMit837UiXqChzl44/EkTP03d5npceMMVx7BEB1Yfei6JOG
- dYdCqzUCw/XCHbPQv41IUap/6N1WH+4SSJMRQoMHT1nDMCBSPAiJhMft0rUQnpKw
- Z6AbEjAvwKt+vWlREvzs
- -----END CERTIFICATE-----
在一个完整的制作证书的过程中,参考后续图6,以上仅完成了产生keystore文件这一步。接下来需要创建证书的签名请求。
-certreq 指明创建签名请求的命令
-alias One 指定条目的别名
-file one.csr 指定签名申请保存在哪个文件
-storepass Letmein123 指定storepass
-keystore KeyStore.jks 指定要给哪个keystore文件申请签名
-ext "san=dns:hostname2" 指定X.509的扩展类别(version 3才需要),san即SubjectAlternativeName,指定另外一个可选名字。扩展的作用是,通过支持在证书中添加任意字段允许客户为application定制证书。具体参考IBM Java文档。
- [root@myserver1 Keys]# keytool -certreq -alias One -keystore KeyStore.jks -file one.csr
- Enter keystore password:
-
- Warning:
- The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore KeyStore.jks -destkeystore KeyStore.jks -deststoretype pkcs12".
- [root@myserver1 Keys]# ll
- total 12
- -rw-r--r-- 1 root root 2229 Jul 4 00:34 KeyStore.jks
- -rw-r--r-- 1 root root 879 Jul 4 00:40 one.cer
- -rw-r--r-- 1 root root 1089 Jul 4 00:44 one.csr
至此,交由CA签名前的准备工作已经完成。下一步,把签名请求one.csr发给CA签名。本例中,我没有用商业CA,而是自己创建一个CA。
步骤如上,也是产生keypair和签名请求。
- [root@myserver1 CA]# openssl req -new -keyout cakey.pem -out careq.pem
- Generating a RSA private key
- ...........................................................................+++++
- ...................+++++
- writing new private key to 'cakey.pem'
- 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) [XX]:CN
- State or Province Name (full name) []:Beijing
- Locality Name (eg, city) [Default City]:HD
- Organization Name (eg, company) [Default Company Ltd]:
- Organizational Unit Name (eg, section) []:IT
- Common Name (eg, your name or your server's hostname) []:myserver1.fyre.ibm.com
- Email Address []:zhangsan@test.com
- Please enter the following 'extra' attributes
- to be sent with your certificate request
- A challenge password []:Letmein123
- An optional company name []:Letmein123
然后从以上创建的careq.pem请求中创建一个证书caroot.cer。把这个caroot.cer导入到浏览器,就相当于一个信任的CA了,等同于商业CA像VeriSign,GlobalSign等等。
-
- [root@myserver1 CA]# openssl x509 -signkey cakey.pem -req -days 3650 -in careq.pem -out caroot.cer -extensions v3_ca
- Signature ok
- subject=C = CN, ST = Beijing, L = HD, O = Default Company Ltd, OU = IT, CN = myserver1.fyre.ibm.com, emailAddress = zhangsan@test.com
- Getting Private key
- Enter pass phrase for cakey.pem:
- [root@myserver1 CA]# ls -lrt
- total 28
- -rw-r--r-- 1 root root 1521 Jul 1 08:55 cacert.pem
- -rw-r--r-- 1 root root 2170 Jul 1 16:44 caKeystore.jks
- -rw-r--r-- 1 root root 1097 Jul 1 16:51 cacertreq.csr
- -rw-r--r-- 1 root root 852 Jul 1 16:53 cacert2.pem
- -rw------- 1 root root 1854 Jul 4 00:48 cakey.pem
- -rw-r--r-- 1 root root 1147 Jul 4 00:49 careq.pem
- -rw-r--r-- 1 root root 1359 Jul 4 00:51 caroot.cer
使用自建的CA证书文件caroot.cer,key文件cakey.pem,给签名申请文件one.csr签名,得到数字证书。-CAserial可以指定序列号基础号,比方说1234,那么新的证书序列号就1235。
- [root@myserver1 Keys]# cd ../CA
- [root@myserver1 CA]# openssl x509 -req -CA caroot.cer -CAkey cakey.pem -CAserial serial.txt -in ../Keys/one.csr -out ../Keys/serverSignedByCA.cer -days 365
- Signature ok
- subject=C = CN, ST = HD, L = Beijing, O = FHTX, OU = Feihongtaxue, CN = San Zhang
- Getting CA Private Key
- Enter pass phrase for cakey.pem:
- [root@myserver1 CA]# cd -
- /ssltest/Keys
- [root@myserver1 Keys]# ls -lrt
- total 24
- -rw-r--r-- 1 root root 2229 Jul 4 00:34 KeyStore.jks
- -rw-r--r-- 1 root root 879 Jul 4 00:40 one.cer
- -rw-r--r-- 1 root root 1089 Jul 4 00:44 one.csr
- -rw-r--r-- 1 root root 2561 Jul 4 07:19 KeyStore.p12
- -rw------- 1 root root 1844 Jul 4 07:21 private_key.pem
- -rw-r--r-- 1 root root 1261 Jul 4 07:38 serverSignedByCA.cer
至此,数字证书已经生成,可以将serverSignedByCA.cer导入到服务器和浏览器中使用了。
在/etc/httpd/conf.d/ssl.conf中,指定证书的private key文件private_key.pem以及证书文件serverSignedByCA.cer。然后重启httpd.service
- [root@myserver1 Keys]# grep SSLCertificateFile /etc/httpd/conf.d/ssl.conf
- SSLCertificateFile /ssltest/Keys/serverSignedByCA.cer
-
- [root@myserver1 Keys]# grep SSLCertificateKeyFile /etc/httpd/conf.d/ssl.conf
- SSLCertificateKeyFile /ssltest/Keys/private_key.pem
-
- [root@myserver1 Keys]# systemctl stop httpd.service
- [root@myserver1 Keys]# systemctl start httpd.service
- [root@myserver1 Keys]# systemctl status httpd.service
- ● httpd.service - The Apache HTTP Server
- Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
- Active: active (running) since Mon 2022-07-04 07:41:00 PDT; 1h 50min ago
- Docs: man:httpd.service(8)
- Main PID: 43921 (httpd)
- Status: "Total requests: 11; Idle/Busy workers 100/0;Requests/sec: 0.00166; Bytes served/sec: 14 B/sec"
- Tasks: 278 (limit: 49478)
- Memory: 58.0M
- CGroup: /system.slice/httpd.service
- ├─43921 /usr/sbin/httpd -DFOREGROUND
- ├─43922 /usr/sbin/httpd -DFOREGROUND
- ├─43923 /usr/sbin/httpd -DFOREGROUND
- ├─43924 /usr/sbin/httpd -DFOREGROUND
- ├─43925 /usr/sbin/httpd -DFOREGROUND
- └─44139 /usr/sbin/httpd -DFOREGROUND
-
- Jul 04 07:41:00 myserver1.fyre.ibm.com systemd[1]: Starting The Apache HTTP Server...
- Jul 04 07:41:00 myserver1.fyre.ibm.com systemd[1]: Started The Apache HTTP Server.
- Jul 04 07:41:00 myserver1.fyre.ibm.com httpd[43921]: Server configured, listening on: port 443, port 80
可以把index.html个性化一下,比如把body里的内容改成下面的句子。
- [root@myserver1 Keys]# cp /usr/share/httpd/noindex/index.html /var/www/html/
- [root@myserver1 Keys]# tail /var/www/html/index.html
- }
- /*]]>*/
- </style>
- </head>
-
- <body>
- <h1>Good Job! You've finished SSL learning and practising <strong>Congratulatins!</strong></h1>
-
- </body>
- </html>
最后,打开浏览器,我用的是Firefox,访问网站https://myserver1.fyre.ibm.com/
选择高级,接受风险和继续,可以打开页面。
至此,这个实验就做完了。