# openssl详解 ## OpenSSL简介 官网:https://www.openssl.org/source/ 是目前最流行的SSL密码库工具,提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS协议的实现 主要构成:密码算法库、密钥和证书封装管理功能、SSL通信API接口 主要用途: 1、建立RSA、DH、DSA key参数 2、建立X.509证书、证书签名请求(CSR)和CRLs(证书回收列表) 3、计算消息摘要 4、使用各种Cipher加密、解密 5、SSL/TLS客户端以及服务器的测试 6、处理S/MIME或者加密邮件 ## RSA密钥操作 ### 私钥无密码默认加密方式 ``` 生成RSA私钥(无加密) [root@master1 pki]# openssl genrsa -out rsa_private.key 2048 根据私钥生成对应的公钥 [root@master1 pki]# openssl rsa -in rsa_private.key -pubout -out rsa_public.key ``` ### 私钥有密码使用aes256加密方式 ``` 生成私钥 [root@master1 pki]# openssl genrsa -aes256 -passout pass:111111 -out rsa_aes_private.key 2048 其中passout代替shell进行密码输入,否则会提示输入密码,固定格式 pass:密码 此时生成公钥会需要密码 [root@master1 pki]# openssl rsa -in rsa_aes_private.key -passin pass:111111 -pubout -out rsa_aes_public.key 其中使用passin 代替了shell进行密码输入 ``` ### 转换命令 ``` 加密私钥转非加密私钥 [root@master1 pki]# openssl rsa -in rsa_aes_private.key -passin pass:111111 -out rsa_aes_private_new.key 非加密私钥转换为加密私钥 [root@master1 pki]# openssl rsa -in rsa_aes_private_new.key -aes256 -passout pass:111111 -out rsa_aes_private_new1.key PEM格式的私钥转DER格式 [root@master1 pki]# openssl rsa -in rsa_private.key -outform DER -out rsa_private.der DER格式的私钥转PEM格式 [root@master1 pki]# openssl rsa -in rsa_private.der -inform DER -outform pem -out rsa_private1.pem -inform 参数指定输入的格式,-outform 参数指定输出的格式 查看私钥明细 [root@master1 pki]# openssl rsa -in rsa_private1.pem -noout -text 查看公钥明细 [root@master1 pki]# openssl rsa -pubin -in rsa_public.key -noout -text 私钥PKCS#1转PKCS#8 [root@master1 pki]# openssl pkcs8 -topk8 -in rsa_private.key -passout pass:111111 -out pkcs8_private.key 其中-passout 指定了密码,输出的pkcs8格式秘钥为加密形式,默认采用des3加密算法,内容如下 -----BEGIN ENCRYPTED PRIVATE KEY----- BASE64 ENcoded Data -----END ENCRYPTED PRIVATE KEY----- 可以使用-nocrypt参数可以输出无加密的pkcs8秘钥 [root@master1 pki]# openssl pkcs8 -topk8 -in rsa_private.key -passout pass:111111 -nocrypt 输出格式如下 -----BEGIN PRIVATE KEY----- BASE64 ENcoded Data -----END PRIVATE KEY----- ``` ## 生成自签名证书 ### 生成RSA私钥和自签名证书 ``` [root@master1 pki]# openssl req -newkey rsa:2048 -nodes -keyout ca.key -x509 -days 3650 -out ca.crt 参数讲解 req是证书请求的子命令 -newkey rsa:2048 -keyout ca.key 表示生成私钥(PKCS8格式) -nodes 表示私钥不加密,若不带此参数,将提示输入密码 -x509 表示输出证书 -days 3650 表示证书有效期,这里有效期为10年 此后提示输入证书拥有者信息: 若执行自动输入,可使用-subj 选项,如下 [root@master1 pki]# openssl req -newkey rsa:2048 -nodes -keyout ca.key -x509 -days 3650 -out ca.crt -subj "/C=CN/ST=GD/L=SZ/O=lingcb/OU=DEV/CN=lingcb.com/emailAddress=xieys@lingcb.com" C 国家 ST 省份 L 城市 O 公司 OU 部门 CN 名字 emailAddress邮箱地址 其中CN(公用名称 Common Name) 简称CN字段,对于SSL证书,一般为网站域名;对于代码签名证书则为申请者单位名称;对于客户端证书则为证书申请者的姓名 ``` ### 使用已有的RSA私钥生成自签名证书 ``` [root@master1 pki]# openssl req -new -x509 -days 3650 -key ca.key -out ca.crt 参数讲解 -new 指生成证书请求,加上-x509表示直接输出证书,-key 指定私钥文件 ``` ## 生成签名请求以及CA签名 ### 使用RSA私钥生成CSR签名请求 ``` 创建RSA 私钥 [root@master1 pki]# openssl genrsa -aes256 -passout pass:111111 -out server.key 2048 通过私钥生成csr签名请求 [root@master1 pki]# openssl req -new -key server.key -passin pass:111111 -out server.csr -subj "/C=CN/ST=GD/L=SZ/O=lingcb/OU=dev/CN=www.lingcb.com" 此时生成的csr签名请求文件可提交至CA进行签发 查看csr文件的细节 [root@master1 pki]# cat server.csr -----BEGIN CERTIFICATE REQUEST----- MIICpDCCAYwCAQAwXzELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkdEMQswCQYDVQQH DAJTWjEPMA0GA1UECgwGTGluZ2NiMQwwCgYDVQQLDANkZXYxFzAVBgNVBAMMDnd3 dy5saW5nY2IuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2JC/ OMexNU39ChWipdlI42a102rK3ah0ZaA+upvRl4RIlBiyxz6cuVnYUI765yodGigK n2DCP2YDvK6fDOfW4nY7fVvbyv8f8fSkkQLz12n90tRRkAcaSqISU841VI9U0s84 gZFLWbGb8Y/IDeBUvcGYeDnBcbkpCAv24xZg4HhbzIVTjrDv5Sy1GwaPq7v3lon4 nXqnBtJ/+us70GJa9uq0XZcO0xBdo47Rrx05+gSzvwHRvGv7WPrvvwQnohcssFsl gnFNby6jaazPUsgHSAiY7klL3wLZyehLScG0nHbyUFi81/9sdb1bF2bh1o0QxZYC kIHN8rOLA4Yft7ThIQIDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAHoXvSEbq+0t UjZvY+oFDNz6Jt23QKQifbEEz+sc58BfxRPWSVrSiMzYl2N4+jsZTZLW7HLcKlMU wXb4VJbEnezuwFRiqc3s4L0OY79Zn2C2otbFzApfXRWshZAKuLeYgMfYZfaqf/le e07JJzSCl2VvM81j58DCqUIl/ur1c23c+A/nSFp0fXIakIDP3KLY632UNefWpyJB HnXOwfajjpVWmRPFXID+w4N/wNQJaTMZhACAqyeHXibNZNHO4YLf3Th0knlhAOuL QiniJQaobMyje8gb8gUC0qxDkEP+wlJLaEmeUq+SDR+J+45qYmwuiXp9EG5lTKN7 I1PbVDyG+AU= -----END CERTIFICATE REQUEST----- [root@master1 pki]# openssl req -noout -text -in server.csr Certificate Request: Data: Version: 0 (0x0) Subject: C=CN, ST=GD, L=SZ, O=lingcb, OU=dev, CN=www.lingcb.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) .... 使用CA证书以及CA秘钥 对请求签发证书进行签发,生成x509证书 [root@master1 pki]# openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -passin pass:111111 -CAcreateserial -out server.crt 其中参数CAXXX 适用于CA参数输入 查看证书细节 [root@master1 pki]# openssl x509 -in server.crt -noout -text ``` ## 查看证书目录下的证书对应的域名 ``` [root@Haproxy01 ~]# cat s.sh #!/bin/bash for i in `ls /etc/haproxy/T` do echo $i && openssl x509 -in $i -noout -text | grep 'Subject: CN=' done ```