[工具] SSL 证书

操作记录

创建证书 keytool

keytool 生成私钥和证书

keytool -genkeypair -alias serverkey -keypass 123456 -storepass 123456 \
    -dname "CN=server.com,OU=group,O=comp,L=cz,ST=sx,C=cn" \
    -keyalg RSA -keysize 2048 -validity 3650 -keystore server.keystore

keytool -genkeypair -alias clientkey -keypass 123456 -storepass 123456 \
    -dname "CN=name,OU=group,O=comp,L=cz,ST=sx,C=cn" \
    -keyalg RSA -keysize 2048 -validity 3650 -keystore client.keystore

# 迁移到行业标准格式 PKCS12 
keytool -importkeystore -srckeystore server.keystore -destkeystore server.keystore -deststoretype pkcs12
keytool -importkeystore -srckeystore client.keystore -destkeystore client.keystore -deststoretype pkcs12

# 导出证书 DER编码格式 (添加  `-rfc` 可输出 PEM 编码格式的证书)
# keytool -exportcert -keystore server.keystore -file server.crt -alias serverkey -storepass 123456
keytool -exportcert -keystore server.keystore -file server.cer -alias serverkey -storepass 123456
keytool -exportcert -keystore client.keystore -file client.cer -alias clientkey -storepass 123456

# 导入信任证书
keytool -importcert -keystore client_trust.keystore -file server.cer -alias client_trust_server -storepass 123456 -noprompt
keytool -importcert -keystore server_trust.keystore -file client.cer -alias server_trust_client -storepass 123456 -noprompt


# jks格式 转 pkcs12
keytool -importkeystore -srckeystore server.keystore -destkeystore server.p12 -srcalias serverkey -destalias serverkey \
    -srcstoretype jks -deststoretype pkcs12 -srcstorepass 123456 -deststorepass 123456 -noprompt

keytool -importkeystore -srckeystore client.keystore -destkeystore client.p12 -srcalias clientkey -destalias clientkey \
    -srcstoretype jks -deststoretype pkcs12 -srcstorepass 123456 -deststorepass 123456 -noprompt

# p12 证书提取pem证书和私钥
openssl pkcs12 -in server.p12 -clcerts -nokeys -out server.crt
openssl pkcs12 -in server.p12 -nocerts -nodes -out server.key

openssl pkcs12 -in client.p12 -clcerts -nokeys -out client.crt

# Nginx 配置
ssl_certificate /root/keytool/server.crt;
ssl_certificate_key /root/keytool/server.key;
ssl_client_certificate /root/keytool/client.crt;
ssl_verify_client on;

# Android 使用 Portecle 工具修改类型
- client.keystore -> client.p12
- client_trust.keystore -> client_trust.bks

创建证书 openssl

  • 服务端 server.crt / server.key
  • 客户端 client.crt / client.key
  • 双方信任的 root.crt

root, 生成CA私钥(.key) --> 生成CA证书请求(.csr) --> 自签名得到根证书(.crt)

  1. 生成根证书密钥 root.key (生成 RSA私钥)
    openssl genrsa -out root.key 2048 -aes256 -passout pass:123456
  2. 生成根证书请求文件 root.csr (从现有的私钥中生成一个 证书签署请求CSR)
    openssl req -key root.key -new -out root.csr -subj "/C=CN/ST=SX/L=CZ/O=mycpmpany/OU=mygroup/CN=myCA"
  3. 自签根证书 root.crt (从现有的私钥和 CSR 生成自签证书 crt)
    openssl x509 -req -days 3650 -sha256 -CAcreateserial -signkey root.key -in root.csr -out root.crt

服务端, 用自签根证书 root.crt 给用户证书签名, 生成私钥(.key) --> 生成证书请求(.csr) --> 用CA根证书签名得到证书(.crt)

  1. server.key 服务器端的秘钥文件
  • openssl genrsa -out server.key 2048 -aes256 -passout pass:123456 私钥
  • openssl rsa -in server.key -pubout -out server.pem -passin pass:123456 公钥
  1. server.csr 服务端证书请求文件 (从现有的私钥中生成一个 证书签署请求CSR)
    openssl req -new -sha256 -key server.key -out server.csr -subj "/C=CN/ST=SX/L=CZ/O=mycpmpany/OU=mygroup/CN=myserver"
  2. server.crt 有效期十年的服务器端公钥证书,使用根证书和服务器端私钥文件一起生成
    openssl x509 -req -days 3650 -sha256 -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -in server.csr -out server.crt
  3. 将证书转为p12格式, p12格式的证书包含公私钥
    openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.p12 -passout pass:123456

客户端

  1. client.key 客户端的私钥文件
    openssl genrsa -out client.key 2048 -aes256 -passout pass:123456
  2. clinet.csr : 客户端证书请求文件 (从现有的私钥中生成一个 证书签署请求CSR)
    openssl req -key client.key -new -out client.csr -subj "/C=CN/ST=SX/L=CZ/O=mycpmpany/OU=mygroup/CN=myclient"
  3. client.crt 有效期十年的客户端证书,使用根证书和客户端私钥一起生成
    openssl x509 -req -days 3650 -sha256 -signkey client.key -CA root.crt -CAkey root.key -CAcreateserial -in client.csr -out client.crt
  4. client.p12 客户端p12格式,这个证书文件包含客户端的公钥和私钥,主要用来给浏览器访问使用
    openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12 -passout pass:123456
  5. 使用 bcprov-ext-jdk15on-158.jar 生成 Android 的 bks keytool -importcert -v -trustcacerts -alias android -file root.crt -keystore client-trust.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-ext-jdk15on-158.jar -storepass 123456

基础知识

HTTPS = HTTP + SSL

HTTP 和 HTTPs

HTTP(超文本传输协议)是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。[1]

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,易遭受窃听、篡改、劫持等攻击,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。[1]

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密,一次HTTPS协议实现了数据传输过程中的保密性、完整性和身份认证性。[1]

  • HTTPS协议需要到CA申请证书,而HTTP协议则不用;
  • HTTP是超文本传输协议,信息是明文传输,而HTTPS则是加密传输;
  • HTTP和HTTPS使用完全不同的连接方式,所占用的端口也不一样,前者占用80端口,后者占用443端口;
  • HTTPS传输过程比较复杂,对服务端占用的资源比较多,由于握手过程的复杂性和加密传输的特性导致HTTPS传输的效率比较低;HTTP的连接很简单,是无状态的;
  • HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

SSL 和 TLS

SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。[2]

SSL协议提供的服务主要有:

  • 认证用户和服务器,确保数据发送到正确的客户机和服务器;
  • 加密数据以防止数据中途被窃取;
  • 维护数据的完整性,确保数据在传输过程中不被改变。

TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。[2]

TLS的最大优势就在于:TLS是独立于应用协议。高层协议可以透明地分布在TLS协议上面。然而,TLS标准并没有规定应用程序如何在TLS上增加安全性;它如何启动TLS握手协议以及如何解释交换的认证证书的决定权留给协议的设计者和实施者来判断。

TLS的主要目标是使SSL更安全,并使协议的规范更精确和完善。TLS在SSL v3.0的基础上,提供了以下增加内容:

  • 更安全的MAC算法
  • 更严密的警报
  • “灰色区域”规范的更明确的定义

SSL证书

  • .pem 是Privacy Enhanced Mail的缩写,它是一个失败的保护电子邮件的方法,但是这个容器格式一直在使用。
  • .key 这是一个PEM格式的文件,只包含证书的私钥。
  • X.509 是密码学里公钥证书的格式标准。证书组成结构标准用ASN.1(一种标准的语言)来进行描述。
  • ASN.1 抽象语法标记(Abstract Syntax Notation One) ASN.1是一种 ISO/ITU-T 标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。
  • DER (Distinguished Encoding Rules,可辨别编码规则)。ASN.1对象的编码是ASN.1标准的重要部分,通常采用的是BER,而DER则是其一个子集。
  • .csr 证书认证签名请求(Certificate signing request), 这是证书申请文件,生成证书时要把这个提交给权威的证书颁发机构,颁发机构审核通过之后,再根据这些申请信息生成相应的证书。
  • .pkcs12 .pfx .p12 最初定义在RSA的Public-Key Cryptography Standards,"12"这个版本开始是微软使用,后来定义在 RFC 7292。这是一个密码容器格式,可以包含公钥和私钥证书对。跟.pem文件不同,这个容器格式是加密的。java的keytool工具可以产生这种格式的证书。
  • .der ASN.1语法的编码规则之一。.pem文件是.der文件的Base64版本。
  • .cert .cer .crt 证书(Certificate) .pem文件的不同格式,也可以是.der文件。这些文件在Windows下可以直接识别,.pem无法识别。
  • .p7b .keystore 定义在RFC 2315这是Windows用于证书交换的一种格式,java支持该格式,通常用.keystore作为后缀。
  • .crl 证书吊销列表。

SSL证书也叫安全证书或者数字证书,SSL证书是数字证书的一种,跟驾驶证、护照、营业执照电子副本类似。SSL证书是一种国际通用的Web安全标准,主要通过对敏感数据加密来防止各种攻击非法读取重要信息,保证数据的完整性和安全性,避免受到数据劫持和钓鱼攻击等。[3]

SSL 证书是由受信任的数字证书颁发机构 CA,在验证服务器身份后颁发,且具有服务器身份验证和数据传输加密功能。简单说就是让你网站通过 HTTPS 加密传输协议访问的一个必要文件。[4]

数字证书认证机构(Certificate Authority,缩写为CA),是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。CA 机构是独立的,没有相互关系,这些机构都是在webtrust认证审核下成立的。[4]

签发主流机构:Symantec、Comodo、GeoTrust、DigiCert、GlobalSign 等。

SSL证书根据验证级别,分为三种类型:

  • 域名型SSL证书,简称DVSSL (常用于 个人站点)
  • 企业型SSL证书,简称OVSSL (常用于 普通企业网站)
  • 增强型SSL证书,简称EVSSL (常用于 企业官网、电商、P2P等互联网金融网站)。

自签名SSL证书

自己生成的SSL证书,不是CA机构颁发的SSL证书,就是自签名证书。自签名SSL证书不会被浏览器信任,数据被泄漏级劫持安全漏洞安全风险较高。

如果你想使用 SSL 证书来确保服务的安全,但你不需要 CA 签名的证书,一个有效的(和免费的)解决方案是签署你自己的证书。
你可以自己签发的一种常见证书是自签证书self-signed certificate。自签证书是用自己的私钥签署的证书。自签证书和 CA 签名证书一样可以用来加密数据,但是你的用户会显示一个警告,说这个证书不被他们的计算机或浏览器信任。[5]

如果你想从证书颁发机构certificate authority(CA)那里获得 SSL 证书,你必须生成一个证书签署请求certificate signing request(CSR)。

openssl / keytool

JDK里面内置了一个数字证书生产工具:keytool。但是这个工具只能生成自签名的数字证书。所谓自签名就是指证书只能保证自己是完整的,没有经过非法修改的。

keytool 没办法签发证书,而 openssl 能够进行签发和证书链的管理

常用命令

openssl

设置密码

  • -passin -pass:123456 用于签名待生成的请求证书的私钥文件的解密密码
  • -passout arg arg为对称加密(des/aes)的密码 (省去了console交互提示输入密码的环节)
  • -password -pass:123456 导入导出

自动输入
-subj "/C=CN/ST=SX/L=CZ/O=cpmpany/OU=example/CN=example.com/[email protected]"

  • C: Country,单位所在国家,为两位数的国家缩写,如:CN 表示中国
  • ST: State/Province,单位所在州或省
  • L: Locality,单位所在城市/或县区
  • O: Organization,单位名称
  • OU: Organization Unit,部门名称
  • CN: Common Name,网站的域名;例:adf.com 或 IP
  • Email Address: 邮箱

RSA私钥公钥[6]

  • -nodes无密码
  • -passout pass:123456 有密码

默认情况下,openssl 输出格式为 PKCS#1-PEM

  • openssl genrsa -out cakey.pem 2048 pem 格式 (内容是 -----END RSA PRIVATE KEY-----)
  • openssl genrsa -out cakey.key 2048 key 格式 (内容也是 -----END RSA PRIVATE KEY-----)
  • openssl genrsa -out root.key 2048 -aes256 -passout pass:123456 设置密码

加密

  • openssl genrsa -des3 -out rsa_des_private.key 2048 使用des3加密
  • openssl genrsa -aes256 -passout pass:123456 -out rsa_aes_private.key 2048 生成RSA私钥, 使用aes256加密, -passout 代替shell 进行密码输入
  • openssl rsa -in rsa_aes_private.key -passin pass:123456 -pubout -out rsa_public.key 生成RSA公钥

非加密

  • openssl genrsa -out rsa_private.key 2048 生成RSA私钥(无加密)
  • openssl rsa -in rsa_private.key -pubout -out rsa_public.key 生成RSA公钥

转换

  • openssl rsa -in rsa_aes_private.key -passin pass:123456 -out rsa_private.key 私钥转非加密
  • openssl rsa -in rsa_private.key -aes256 -passout pass:123456 -out rsa_aes_private.key 私钥转加密
  • openssl rsa -in rsa_private.key -outform der-out rsa_aes_private.der 转DER, -inform/-outform 制定输入输出格式
  • openssl pkcs8 -topk8 -in rsa_private.key -passout pass:123456 -out pkcs8_private.key 私钥PKCS#1转PKCS#8, pkcs8默认采用des3加密,

查看密钥

  • openssl rsa -in server.key -noout -text
  • openssl rsa -in server.key -text 使用-nocrypt可以输出无加密的pkcs8密钥, 使用-pubin可查看公钥明细
  • cat server.key

证书签署请求 CSR 文件

如果你想使用 HTTPS(HTTP over TLS)来保护你的 Apache HTTP 或 Nginx Web 服务器的安全,并且你想使用一个证书颁发机构(CA)来颁发 SSL 证书,那么就需要 CSR, 生成的 CSR 可以发送给 CA,请求签发由 CA 签名的 SSL 证书。

使用现有 RSA私钥生成 CSR签名请求 -key指定私钥, -out生成文件

  • openssl req -key clientkey.pem -new -out client.csr -subj "..." pem
  • openssl req -key root.key -new -out root.csr -subj "..." key

同时生成 RSA私钥 和 CSR签名请求
openssl req -newkey rsa:2048 -nodes -keyout server.key -out server.csr -subj "..."

从现有的证书(cert.crt)和私钥(server.key)生成 CSR(server.csr)
openssl x509 -in cert.crt -signkey server.key -x509toreq -out server.csr

  • -x509toreq 指定你使用一个 X509 证书来制作 CSR

查看 CSR
openssl req -text -in server.csr -noout

证书 CRT

CA

  • openssl x509 -req -days 3650 -sha256 -extensions v3_ca -signkey cakey.pem -in ca.csr -out cacert.cer
  • openssl x509 -req -days 3650 -sha256 -extensions v3_ca -signkey root.key -in root.csr -out root.crt
  • openssl x509 -req -days 3650 -sha256 -signkey root.key -in root.csr -out root.crt

用CA根证书签发应用证书 (server)

  • openssl x509 -req -days 3650 -sha256 -extensions v3_req -CA cacert.pem -CAkey cakey.pem -CAserial ca.srl -CAcreateserial -in server.csr -out servercert.pem
  • openssl x509 -req -days 3650 -sha256 -extensions v3_req -CA root.crt -CAkey root.key -CAserial ca.srl -CAcreateserial -in server.csr -out server.crt
  • openssl x509 -req -days 3650 -sha256 -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -in server.csr -out server.crt
  • openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key

直接生成 私钥和 SSL 自签证书
openssl req -newkey rsa:2048 -days 3650 -nodes -x509 -keyout ca.key -out ca.crt -subj "..."

  • req 是证书请求的子命令
  • -newkey rsa:2048 -keyout private_key.pem 表示生成私钥(PKCS8格式)
  • -nodes 表示私钥不加密,若不带参数将提示输入密码
  • -x509 告诉 req 子命令创建一个自签名的证书
  • -days 365 指定证书的有效期为 365 天

从现有 私钥 生成 自签名证书, -new生成证书请求, x509直接输出证书, -key指定私钥
openssl req -new -x509 -sha256 -days 3650 -key root.key -out root.crt -passin pass:123456 -subj "..."

从现有 私钥和CSR 生成 自签证书, x509指定格式, -in指定请求文件, -signkey自签名

  • openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
  • openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -passin pass:123456 -CAcreateserial -out server.crt CA 证书

使用 已有RSA 私钥生成自签名证书 (生成 ca.crt)
openssl req -new -x509 -days 365 -key rsa_private.key -out cert.crt

  • -new 指生成证书请求
  • -x509 表示直接输出证书
  • -key 指定私钥文件

使用 CA 证书及CA密钥 对请求签发证书进行签发,生成 x509证书 (使用 ca 签发 server.crt)

  • openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -passin pass:123456 -CAcreateserial -out server.crt

查看证书

  • openssl x509 -in cert.crt -noout -text

证书转换

  • openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem 将 DER 转换为 PEM
  • openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:123456 -password pass:123456 -out server.p12 将pem证书和私钥转 pkcs#12 证书, -export导出pkcs#12证书,-inkey指定私钥
  • openssl pkcs12 -export -inkey domain.key -in domain.crt -out domain.pfx 将 PEM 转换为 PKCS12, 使用私钥(domain.key)和证书(domain.crt),并将它们组合成一个 PKCS12 文件(domain.pfx)
  • openssl pkcs12 -export -clcerts -in server.crt -inkey server.key -out server.p12 -passin pass:123456 -password pass:123456 证书转为p12格式, p12格式的证书包含公私钥
  • openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:123456 -chain -CAfile ca.crt -password pass:123456 -out server-all.p12 将pem证书和私钥/CA证书 合成pkcs#12 证书, -chain同时添加证书链, -CAfileCA证书,导出的p12文件将包含多个证书
  • openssl x509 -in cert.crt -outform der -out server.der 将 PEM 转换为 DER, DER 格式通常与 Java 一起使用。
  • openssl pkcs12 -in domain.pfx -nodes -out domain.combined.crt 将 PKCS12 转换为 PEM, 转换 PKCS12 文件(domain.pfx)并将其转换为 PEM 格式(domain.combined.crt)
  • openssl pkcs12 -in server.p12 -password pass:123456 -passout pass:123456 -out server.pem pcks#12提取PEM文件(同时包含证书和私钥pkcs#8)
  • openssl pkcs12 -in server.p12 -password pass:123456 -passout pass:123456 -nocerts -out key.pem 仅提取私钥
  • openssl pkcs12 -in server.p12 -password pass:123456 -nokeys -out key.pem 仅提取证书
  • openssl pkcs12 -in server-all.p12 -password pass:123456 -nokeys -cacerts -out cacert.pem 仅提取ca证书
  • openssl pkcs12 -in server-all.p12 -password pass:123456 -nokeys -clcerts -out cert.pem 仅提取server证书
  • openssl pkcs12 -in server.pfx -nodes -out server.pem PFX文件转换为 pem
  • openssl rsa -in server.pem -out server2.key PFX文件转换为密钥
  • openssl x509 -in server.pem -out server2.crt PFX文件转换为证书

验证

检查私钥是否为有效密钥
openssl rsa -check -in rsa_private.key

验证私钥是否与证书和 CSR 匹配

  • openssl rsa -noout -modulus -in rsa_private.key | openssl md5
  • openssl x509 -noout -modulus -in cert.crt | openssl md5
  • openssl req -noout -modulus -in server.csr | openssl md5

查看 CSR 条目, 查看和验证纯文本的 CSR 内容
openssl req -text -noout -verify -in server.csr

使用CA证书验证server端证书

  • openssl verify -CAfile cacert.pem servercert.pem
  • openssl verify -CAfile root.crt server.crt

验证证书由 CA 签署
openssl verify -verbose -CAFile ca.crt cert.crt

openssl 命令参数

参考 https://cloud.tencent.com/developer/article/1444793

1. openssl list-standard-commands(标准命令)
    1) asn1parse: asn1parse用于解释用ANS.1语法书写的语句(ASN一般用于定义语法的构成) 
    2) ca: ca用于CA的管理 
    openssl ca [options]:
        2.1) -selfsign
        使用对证书请求进行签名的密钥对来签发证书。即"自签名",这种情况发生在生成证书的客户端、签发证书的CA都是同一台机器(也是我们大多数实验中的情况),我们可以使用同一个
密钥对来进行"自签名"
        2.2) -in file
        需要进行处理的PEM格式的证书
        2.3) -out file
        处理结束后输出的证书文件
        2.4) -cert file
        用于签发的根CA证书
        2.5) -days arg 
        指定签发的证书的有效时间
        2.6) -keyfile arg   
        CA的私钥证书文件
        2.7) -keyform arg
        CA的根私钥证书文件格式:
            2.7.1) PEM
            2.7.2) ENGINE 
        2.8) -key arg   
        CA的根私钥证书文件的解密密码(如果加密了的话)
        2.9) -config file    
        配置文件
    example1: 利用CA证书签署请求证书
    openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key  

    3) req: X.509证书签发请求(CSR)管理
    openssl req [options] outfile
        3.1) -inform arg
        输入文件格式
            3.1.1) DER
            3.1.2) PEM
        3.2) -outform arg   
        输出文件格式
            3.2.1) DER
            3.2.2) PEM
        3.3) -in arg
        待处理文件
        3.4) -out arg
        待输出文件
        3.5) -passin        
        用于签名待生成的请求证书的私钥文件的解密密码
        3.6) -key file
        用于签名待生成的请求证书的私钥文件
        3.7) -keyform arg  
            3.7.1) DER
            3.7.2) NET
            3.7.3) PEM
        3.8) -new
        新的请求
        3.9) -x509          
        输出一个X509格式的证书 
        3.10) -days
        X509证书的有效时间  
        3.11) -newkey rsa:bits 
        生成一个bits长度的RSA私钥文件,用于签发  
        3.12) -[digest]
        HASH算法
            3.12.1) md5
            3.12.2) sha1
            3.12.3) md2
            3.12.4) mdc2
            3.12.5) md4
        3.13) -config file   
        指定openssl配置文件
        3.14) -text: text显示格式
    example1: 利用CA的RSA密钥创建一个自签署的CA证书(X.509结构) 
    openssl req -new -x509 -days 3650 -key server.key -out ca.crt 
    example2: 用server.key生成证书签署请求CSR(这个CSR用于之外发送待CA中心等待签发)
    openssl req -new -key server.key -out server.csr
    example3: 查看CSR的细节
    openssl req -noout -text -in server.csr

    4) genrsa: 生成RSA参数
    openssl genrsa [args] [numbits]
        [args]
        4.1) 对生成的私钥文件是否要使用加密算法进行对称加密:
            4.1.1) -des: CBC模式的DES加密
            4.1.2) -des3: CBC模式的DES加密
            4.1.3) -aes128: CBC模式的AES128加密
            4.1.4) -aes192: CBC模式的AES192加密
            4.1.5) -aes256: CBC模式的AES256加密
        4.2) -passout arg: arg为对称加密(des、des、aes)的密码(使用这个参数就省去了console交互提示输入密码的环节)
        4.3) -out file: 输出证书私钥文件
        [numbits]: 密钥长度
    example: 生成一个1024位的RSA私钥,并用DES加密(密码为1111),保存为server.key文件
    openssl genrsa -out server.key -passout pass:1111 -des3 1024 

    5) rsa: RSA数据管理
    openssl rsa [options] outfile
        5.1) -inform arg
        输入密钥文件格式:
            5.1.1) DER(ASN1)
            5.1.2) NET
            5.1.3) PEM(base64编码格式)
         5.2) -outform arg
         输出密钥文件格式
            5.2.1) DER
            5.2.2) NET
            5.2.3) PEM
        5.3) -in arg
        待处理密钥文件 
        5.4) -passin arg
        输入这个加密密钥文件的解密密钥(如果在生成这个密钥文件的时候,选择了加密算法了的话)
        5.5) -out arg
        待输出密钥文件
        5.6) -passout arg  
        如果希望输出的密钥文件继续使用加密算法的话则指定密码 
        5.7) -des: CBC模式的DES加密
        5.8) -des3: CBC模式的DES加密
        5.9) -aes128: CBC模式的AES128加密
        5.10) -aes192: CBC模式的AES192加密
        5.11) -aes256: CBC模式的AES256加密
        5.12) -text: 以text形式打印密钥key数据 
        5.13) -noout: 不打印密钥key数据 
        5.14) -pubin: 检查待处理文件是否为公钥文件
        5.15) -pubout: 输出公钥文件
    example1: 对私钥文件进行解密
    openssl rsa -in server.key -passin pass:111 -out server_nopass.key
    example:2: 利用私钥文件生成对应的公钥文件
    openssl rsa -in server.key -passin pass:111 -pubout -out server_public.key

    6) x509:
    本指令是一个功能很丰富的证书处理工具。可以用来显示证书的内容,转换其格式,给CSR签名等X.509证书的管理工作
    openssl x509 [args]    
        6.1) -inform arg
        待处理X509证书文件格式
            6.1.1) DER
            6.1.2) NET
            6.1.3) PEM
        6.2) -outform arg   
        待输出X509证书文件格式
            6.2.1) DER
            6.2.2) NET
            6.2.3) PEM
        6.3) -in arg 
        待处理X509证书文件
        6.4) -out arg       
        待输出X509证书文件
        6.5) -req            
        表明输入文件是一个"请求签发证书文件(CSR)",等待进行签发 
        6.6) -days arg       
        表明将要签发的证书的有效时间 
        6.7) -CA arg 
        指定用于签发请求证书的根CA证书 
        6.8) -CAform arg     
        根CA证书格式(默认是PEM) 
        6.9) -CAkey arg      
        指定用于签发请求证书的CA私钥证书文件,如果这个option没有参数输入,那么缺省认为私有密钥在CA证书文件里有
        6.10) -CAkeyform arg  
        指定根CA私钥证书文件格式(默认为PEM格式)
        6.11) -CAserial arg   
        指定序列号文件(serial number file)
        6.12) -CAcreateserial 
        如果序列号文件(serial number file)没有指定,则自动创建它     
    example1: 转换DER证书为PEM格式
    openssl x509 -in cert.cer -inform DER -outform PEM -out cert.pem
    example2: 使用根CA证书对"请求签发证书"进行签发,生成x509格式证书
    openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
    example3: 打印出证书的内容
    openssl x509 -in server.crt -noout -text 

keytool

  • jks 是Java的keytool证书工具支持的证书私钥格式
  • pfx 是微软支持的私钥格式(p12是pfx的新格式)
  • cer / crt 是证书的公钥格式(cer是crt证书的微软形式)
  • csr 数字证书签名请求文件(Cerificate Signing Request)
  • .der .cer 此证书文件是二进制格式,只含有证书信息,不包含私钥
  • .crt : 此证书文件是二进制格式或文本格式,一般为文本格式,功能与 .der 及 .cer 证书文件相同
  • .pem : 此证书文件一般是文本格式,可以存放证书或私钥,或者两者都包含
  • .pem 文件如果只包含私钥,一般用 .key 文件代替
  • .pfx .p12 : 此证书文件是二进制格式,同时包含证书和私钥,且一般有密码保护
  • .keystore .truststore : 两者本质都是keystore,都是储存密钥的容器

  • 使用 ketytool --help 获取所有可用命令
  • 使用 keytool -command_name -help 来获取 command_name 的用法
keytool --help
密钥和证书管理工具

命令:

 -certreq            生成证书请求
 -changealias        更改条目的别名
 -delete             删除条目
 -exportcert         导出证书
 -genkeypair         生成密钥对
 -genseckey          生成密钥   genkey
 -gencert            根据证书请求生成证书
 -importcert         导入证书或证书链
 -importpass         导入口令
 -importkeystore     从其他密钥库导入一个或所有条目
 -keypasswd          更改条目的密钥口令     私钥加解密密码
 -list               列出密钥库中的条目
 -printcert          打印证书内容
 -printcertreq       打印证书请求的内容
 -printcrl           打印 CRL 文件的内容
 -storepasswd        更改密钥库的存储口令   文件存储密码

删除

  • keytool -delete -alias client -keystore client.p12 -keypass 123456 -storepass 123456
  • keytool -delete -alias server -keystore server.p12 -keypass 123456 -storepass 123456
  • keytool -delete -alias trustKeys -keystore trustKeys.p12 -keypass 123456 -storepass 123456
  • keytool -delete -alias localhost -keystore localhost.p12 -keypass 123456 -storepass 123456

查看证书
keytool -list -v -keystore trustKeys.jks -keypass 123456 -storepass 123456

keystore[7]

生成ca/server/client的keypair
keytool -genkeypair -alias ca -keystore ca.keystore -storepass 123456

生成证书请求文件 client.csr
keytool -certreq -alias client -keystore client.keystore -storepass 123456 -file client.csr

用ca进行 client.cer 证书签发
keytool -gencert -alias ca -keystore ca.keystore -storepass 123456 -infile client.csr -outfile client.cer

导出ca证书 (含ca公钥)
keytool -exportcert -alias ca -keystore ca.keystore -storepass 123456 -file ca.cer

把ca证书和ca签名的client证书都导入到client的keystore中, 导入的client.cer将会替换原来client.keystore中相同别名的证书
keytool -importcert -alias ca -keystore client.keystore -storepass 123456 -file ca.cer
keytool -importcert -alias client -keystore client.keystore -storepass 123456 -file client.cer

转为jks格式
keytool -importkeystore -srckeystore hanclientk.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore client.jks -keypass 123456 -storepass 123456

p12

根CA (自签CA, 使用者和颁发者都是它自己), rootca.keystore (pkcs12)
keytool -genkeypair -alias rootca -storetype PKCS12 -keystore rootca.keystore -validity 3650 -keysize 2048 -keyalg RSA -sigalg SHA256withRSA -v -dname "C=CN,ST=SX,L=CZ,O=mycpmpany,OU=mygroup,CN=127.0.0.1" -keypass 123456 -storepass 123456

从密钥库中导出 cer 证书, rootca.cer
keytool -exportcert -alias rootca -keystore rootca.keystore -file rootca.cer -keypass 123456 -storepass 123456

生成 pkcs12 的keystore文件 serverKeystore.jks / clientKeystore.jks

  • keytool -genkeypair -alias server -storetype PKCS12 -keyalg RSA -keysize 1024 -sigalg SHA256withRSA -validity 3650 -keystore serverKeystore.jks -v -dname "C=CN,ST=SX,L=CZ,O=mycpmpany,OU=mygroup,CN=127.0.0.1" -keypass 123456 -storepass 123456
  • keytool -genkeypair -alias client -storetype PKCS12 -keyalg RSA -keysize 1024 -sigalg SHA256withRSA -validity 3650 -keystore clientKeystore.jks -v -dname "C=CN,ST=SX,L=CZ,O=mycpmpany,OU=mygroup,CN=127.0.0.1" -keypass 123456 -storepass 123456

生成证书请求 csr 文件, server.csr / client.csr

  • keytool -certreq -alias server -keystore serverKeystore.jks -storepass 123456 -file server.csr
  • keytool -certreq -alias client -keystore clientKeystore.jks -storepass 123456 -file client.csr

用ca进行证书签发 server.cer / client.cer

  • keytool -gencert -alias rootca -keystore rootca.keystore -storepass 123456 -infile server.csr -outfile server.cer
  • keytool -gencert -alias rootca -keystore rootca.keystore -storepass 123456 -infile client.csr -outfile client.cer

把ca证书和ca签名的client证书都导入到client的keystore中, 导入的client.cer将会替换原来client.keystore中相同别名的证书

  • keytool -importcert -alias ca -keystore client.keystore -storepass 123456 -file ca.cer
  • keytool -importcert -alias client -keystore client.keystore -storepass 123456 -file client.cer

从keystore中导出证书 server.cer / client.cer

  • keytool -exportcert -alias server -keystore serverKeystore.jks -file server.cer -keypass 123456 -storepass 123456
  • keytool -exportcert -alias server -keystore clientKeystore.jks -file client.cer -keypass 123456 -storepass 123456

将 cer 证书导入信任证书库 clientTruststore.jks / serverTruststore.jks

  • keytool -importcert -alias trustServer -file server.cer -keystore clientTruststore.jks -keypass 123456 -storepass 123456
  • keytool -importcert -alias trustClient -file client.cer -keystore serverTruststore.jks -keypass 123456 -storepass 123456

jks

需要生成双方的密钥文件,并把对方的cert导入自己的密钥文件里[8]

Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore server.jks -destkeystore server.jks -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。

以jks格式生成服务器端包含Public key和Private Key的keystore文件 server.jks
keytool -genkey -alias server -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -keystore server.jks -validity 3650 -v -dname "C=CN,ST=SX,L=CZ,O=mycpmpany,OU=mygroup,CN=myserver" -keypass 123456 -storepass 123456

从keystore中导出别名为server的服务端证书 server.cer
keytool -keystore server.jks -export -alias server -file server.cer -keypass 123456 -storepass 123456

以jks格式生成服务器端包含Public key和Private Key的keystore文件 client.jks
keytool -genkey -alias client -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -keystore client.jks -validity 3650 -v -dname "C=CN,ST=SX,L=CZ,O=mycpmpany,OU=mygroup,CN=myclient" -keypass 123456 -storepass 123456

从keystore中导出别名为client的客户端证书 client.cer
keytool -keystore client.jks -export -alias client -file client.cer -keypass 123456 -storepass 123456

把客户端的 cer 导入到服务端
keytool -import -alias client -file client.cer -keystore server.jks -keypass 123456 -storepass 123456

把服务端的 cer 导入到客户端
keytool -import -alias server -file server.cer -keystore client.jks -keypass 123456 -storepass 123456

分别把 cer 导入 信任库 serverTruststore.jks / clientTruststore.jks / 公共的truststore.jks

  • keytool -import -alias trustClient -file client.cer -keystore serverTruststore.jks -keypass 123456 -storepass 123456
  • keytool -import -alias trustServer -file server.cer -keystore clientTruststore.jks -keypass 123456 -storepass 123456

检验服务端是否具有自己的private key和客户端的cert
keytool -list -keystore server.jks


转换JKS格式为P12, JKS是Java的密钥文件格式,转换成通用的PKCS12格式 (*.p12 / *.pfx)
keytool -importkeystore -srckeystore client.jks -destkeystore client.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass 123456 -deststorepass 123456 -srckeypass 123456 -destkeypass 123456 -srcalias client -destalias client -noprompt

SpringBoot yml 配置

server:
  ssl:
    enabled: true
    key-store-type: JKS # PKCS12 #JKS
    key-store: classpath:certificate/server.jks
    key-store-password: 123456
    key-alias: server
    client-auth: need
    trust-store-provider: SUN
    trust-store-type: JKS
    trust-store: classpath:certificate/server.jks # serverTruststore.jks
    trust-store-password: 123456

测试验证

curl

  • --cert指定客户端公钥证书的路径
  • -key指定客户端私钥文件的路径
  • -k不校验证书的合法性,因为我们用的是自签名证书,所以需要加这个参数
  • -v 可选, 来观察具体的SSL握手过程

导出客户端的cert文件
openssl pkcs12 -nokeys -in client.p12 -out client.pem

导出客户端的key文件
openssl pkcs12 -nocerts -nodes -in client.p12 -out client.key

使用 cert 和 key 测试

  • curl -k --cert client.pem --key client.key https://localhost/hello

使用密码测试

  1. openssl pkcs12 -in client.p12 -nodes -out client.pem -password pass:123456 导出 pem
  2. curl -k --cert client.pem:123456 https://localhost/hello 测试

参考资料


  1. https://www.jianshu.com/p/a7292b4db7bd ↩ ↩ ↩

  2. https://blog.csdn.net/enweitech/article/details/81781405 ↩ ↩

  3. https://www.jianshu.com/p/3f20772cd0be ↩

  4. https://www.cnblogs.com/mafly/p/ssl.html ↩ ↩

  5. https://linux.cn/article-12293-1.html ↩

  6. https://cloud.tencent.com/developer/article/1444793 ↩

  7. https://bbs.huaweicloud.com/blogs/288569 ↩

  8. https://www.cnblogs.com/larrydpk/p/12830365.html ↩

你可能感兴趣的:([工具] SSL 证书)