路漫漫其修远兮
吾将上下而求索

openssl生成自签证书

1、openssl对称加密

示例

[root@localhost ~]#cp /etc/fstab .
[root@localhost ~]#ls
fstab
[root@localhost ~]#cat fstab 

#
# /etc/fstab
# Created by anaconda on Thu Jul 21 15:53:22 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=3e02bed8-027f-47ae-91cb-994223f593a7 /                       ext4    defaults        1 1
UUID=9f959a36-3cbb-4e86-8bd6-f8338d3f1e2b /boot                   ext4    defaults        1 2
UUID=e1ff52bb-937b-4efd-8d1b-0f59fbe4cfec /test                   ext4    defaults        1 2
UUID=f262cebf-ed9a-4124-a67f-5e9487264b91 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

[root@localhost ~]#openssl enc -e -des3 -a -salt -in fstab -out fstab.des    #des3对称加密
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:


[root@localhost ~]#ll
total 8
-rw-r--r-- 1 root root  899 May 15 23:41 fstab
-rw-r--r-- 1 root root 1248 May 15 23:43 fstab.des    #加密后的文件
[root@localhost ~]#cat fstab.des 
U2FsdGVkX1/noA1PQHY1ToOxjW09ZLEoLNHjgMgERvAOnRN7r2+HwlajyiQEAwZ5
xnOxDYdMBPPQ7pbTYOAgd0CJXX5RqEwfG0ZLT0l4Tw24mfpuNnqfO3kpZvbDYUWO
KAoz/8Be91Ap+piAywdaRkcsjYnk8Uyw6b0QSd+gsaVmPlFPjt79PXAc7lg5E0rT
Bd0q/cU2UVhudWA0ZQdI1BrKidcI/61f/9oq58gPlYg+CM6SPDMUXtZbI4vecZ7P
52Oeym815cFwPtVXJ0iR+vBv2dKxm8PJADCj6qggqkKi5dzyjsYWDseuLPe1HeH0
T+OjV6mR8dAyK1a+z/gHpp2L5IoVknrZL8vZ0XLl9FsDPQFVr9DlWvnSBoog/azW
9ixLaMN32yCbkoHKlRPPCgUYuaI9uYHWBukoWI2uHi5i1rRW4SC789hGFf/NgcBH
i4jQlmID+DTTXspdvMNI5h8ITTFotwfsy6NqNL3Gn3IlXmDkNytSnZeJGyfkFWlP
XNW3fk64um2pfZHrrRxTCxBKAJLEwLonrrtCvIAIz0p4Fr1GXcYVPDA1lu20vUCm
QuM3/pIR8At7yFJ03UvlzrPeRLcsrz9ngMVaSAGr9+++BwJJ0COOSzOqh7IpWjDA
AHxSoYj6PZaHyjXkzJCMj0BG4kHXzv74fjoVtrDMBvk9S5v5vYM6akBxvMqhcQsi
GLSjGkDamSPbNThaDcxqRrOA3l5W27s1BuZNJi/Wz/VXPISfSHlCwyG07ppcvhkL
gsI6yUp90tfKcggA09p1MHyB/8N32wdYC3W3GWjirPObhhfvMpzBx/LIhEUC/+vY
UWeXasQCDdceU9iquV7GtFZwGE1wibCPsQKCNMYoR4tWxupHb6fkY0yA7RZKdSjz
tq+1q0TZCAwvWIaAgo3pSWi+kp+wccQYAx2UaLcqwf84BjjvLC+Udtcj/2m2pQgr
8jqkjpgSWFkBciiPh/9dmdfE3JDKRl2tdlA1PynX34an4ymq6Yk17wF3yYgwwJno
W75PC0eTZs5346bd38VQHKQDfuRZKdpiL2ME+LSsCoRgZO0zeZt5kg64bJJlJr7K
WIdaala7L++2FhsBOO7mTVZ9vdl6RRsfvHfIUOCrFtZZjImCI09oX3mCSq1DvPFT
mSLv4oGNitkZfOBP3na1Z22bBWAxsBmpSEPCOhcs4w5s7BUXPAqG4Kc7V7KZIS+/
LiFmm/hYv4Y=


[root@localhost ~]#openssl enc -d -des3 -a -salt -out fstab.out -in fstab.des     #des3解密
enter des-ede3-cbc decryption password:
bad decrypt
140575309256520:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:596:
[root@localhost ~]#echo $?    #如果输入密码错误,会返回状态码1
1


[root@localhost ~]#openssl enc -d -des3 -a -salt -out fstab.out -in fstab.des 
enter des-ede3-cbc decryption password:
[root@localhost ~]#echo $?
0
[root@localhost ~]#ls
fstab  fstab.des  fstab.out
[root@localhost ~]#cat fstab.out     #成功将文件解密

#
# /etc/fstab
# Created by anaconda on Thu Jul 21 15:53:22 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=3e02bed8-027f-47ae-91cb-994223f593a7 /                       ext4    defaults        1 1
UUID=9f959a36-3cbb-4e86-8bd6-f8338d3f1e2b /boot                   ext4    defaults        1 2
UUID=e1ff52bb-937b-4efd-8d1b-0f59fbe4cfec /test                   ext4    defaults        1 2
UUID=f262cebf-ed9a-4124-a67f-5e9487264b91 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

2、构建私有CA和证书

openssl和openssh不是一个东西,不能搞混了,

5、SSL回话主要三步:

a. 客户端向服务器端索要并验证证书;ClientHello

i. 支持的协议版本,比如:tls 1.2

ii. 客户端生成一个随机数,稍后用于生成“会话秘钥”

iii. 支持的加密算法,比如AES,RSA

iv. 支持的压缩算法

b. 双方协商生成“会话秘钥”:ServerHello

i. 确认使用的加密通信协议版本,比如:tls 1.2

ii. 服务器生成一个随机数,稍后用于生成“会话秘钥”

iii. 确认使用加密方法;

iv. 发送服务器证书,

v. 索要客户证书,如果是网银之类的要用

c. 双方采用会话秘钥进行加密通信

i. 验证服务器证书,确认无误后取出其公钥(发证机构,证书完整性,证书持有者,证书有效期,吊销列表)

ii. 发送下面信息给服务器端:

1. 一个随机数:(用于服务器端公钥加密)

2. 编码变更通知,表示随后的信息都将用双方商定的加密方法和秘钥进行发送

3. 客户端握手结束通知

d. 收到客户端发来的第三个随机数pre-master-key之后,计算生成本次会话所要用到的“会话秘钥”

i. 向客户端发送如下的信息:

1. 编码变更通知,表示随后的信息都将用双方商定的加密方法和秘钥进行发送

2. 服务端握手结束通知

e. 断开分手

vii. 协议:

1. SSL:安全套接字层(ssl1.0  ssl2.0  ssl3.0)

2. TLS:Transport Layer Sercurity

a. V1.0  V1.1  V1.2(建议)  V1.3(未发布)

3. 分层设计:

a. 最底层:基础算法原语的实现,aes,rsa,md5

b. 向上一层,各种算法实现

c. 再向上一层,组合算法实现的半成品

d. 用各种组件拼装而成的各种成品密码学协议软件

6. OpenSSL

a. 众多子命令,分为三类:

i. 标准命令

ii. 消息摘要命令(dgst子命令)

iii. 加密命令(enc子命令)

b. 对称加密:

i. 加密:#openssl enc -e -des3 -a -salt -in fstab -out fstab.des

ii. 解密:#openssl enc -d -des3 -a -salt -out fstab.out -in fstab.des

c. 单向加密(只会校验文件的数据的区域,不会校验文件的元数据区,改了名字,但是数据不变,校验结果不变,)

i. 工具:openssl dgst,md5sum,sha1sum,,,

ii. [root@localhost ~]#openssl dgst -md5 fstab

iii. MD5(fstab)= fb751617e38060cec3321763b25cdf89

d. 生成用户密码:

i. 工具:passwd,openssl passwd

ii. [root@localhost ~]#openssl passwd -1 -salt 12345678 (盐可以自己制定)

iii. Password: 

iv. $1$12345678$umjkkU7hCEmqLTO4bLxj51

v. [root@localhost ~]#openssl passwd -1 -salt $(openssl rand -hex 4)  (命令替换)

e. 生成随机数

i. 工具:openssl rand

ii. openssl rand -hex NUM  (输出每个字符在0-f之间)

iii. openssl rand -base NUM  

iv. #openssl rand -base64 10

f. 公钥加密:

i. 加密解密

1. 算法:RAS,ELGamal

2. 工具:openssl rsautl,gpg

ii. 数字签名

1. 算法:RAS,DSA,ELGamal

2. 工具:openssl rsautl,gpg

iii. 秘钥交换

1. 算法:DH

iv. 生成私钥:

1. openssl genrsa 1024

2. openssl genrsa 1024 > ./mykey.private

3. openssl genrsa -out ./mykey1.private 1024

4. (umask 077; openssl genrsa -out ./mykey1.private 1024)  保证生成的私钥文件的权限是700,用括号表示在子shell中运行,umask只对子shell生效,秘钥生成后退出子shell,umak还是系统的

v. 从私钥中提取出公钥到单独的文件

1. [root@localhost ~]#openssl rsa -in /PATH/FROM/PRIVATE_KEY_FILE(mykey.private) -pubout

g. linux系统上的随机数生成器:

i. /dev/random:仅从熵池中返回随机数,随机数用尽,阻塞

ii. /dev/urandom:从熵池中返回随机数,随机数用尽,会利用软件生成伪随机数,非阻塞

7. CA:

a. 建立CA

i. openssl

ii. openCA

b. openssl命令:

i. 配置文件:/etc/pki/tls/openssl.cnf

c. 构建私有CA;

i. 在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可。

ii. 具体见下面的操作

证书申请方创建一个证书签名请求certificate signing request(CSR)

证书申请方创建一对密钥(pubkey/prikey)并用prikey来签名csr文件。这包括了请求方的身份信息以及应用的公钥信息用来验证csr的摘要信息以及对应的名称(distinguished name),以及其它额外的信息。

证书申请方将请求发送给CA。

CA收到请求之后会进入到验证流程。不同的验证类型会有不同的步骤。

Domain validation(DV) DV认证只需要证书申请方证明域名是自己的就可以。这可能会有几种方式:

使用提供的邮箱地址(whois检查,比如)发送验证邮件给CA。

通过对域名添加特定的cname记录来证明域名是自己的(cf的模式)

Organization validation(OV) OV认证相比于DV认证会复杂一些,它要求身份认证和机构真实性认证。

Extended validation(EV) 相比于OV认证,EV认证更为复杂,一般来说需要用户的身份认证、机构真实性认证、用户签订承诺函等等。 DV的验证速度取决于邮件接收到的速度或者cname记录认证成功的速度(cf的速度大概为15min以内,亚信的目前有bug),EV证书可能需要数天甚至数周。

验证通过之后CA会签发对应名称(distingu name)的证书。这个证书可能包含证书链,即:从根CA开始到经过的每一级CA到最终的用户证书都会包括。这样才能满足证书认证的机制,如果之后末级证书,那么很有可能会无法认证通过,导致浏览器出现不安全请求的提示。

此时,证书申请方就可以使用该证书了。除非证书被显式吊销,否则只要妥善保管到证书过期之后重新签订新的证书就可以了。 证书过期&吊销目前有2种机制:

 1. CRL(Certificate revocation list)

     CRL就是一个列表,该列表保存了所有吊销证书的序列号。该列表由CA来维护。依赖方(浏览器)需要保持更新该列表,但是可能会越来越大。

 2. OCSP(online certificate status protocol)

     OCSP允许依赖方检查一个证书是否已经被吊销。OCSP服务器也被称为OCSP响应器。每个CA的OCSP响应器的地址在证书的Authority Information Access扩展字段里。虽然相比于CRL,OCSP更为轻量级(只获取一个证书是否过期),但是由于需要请求线上的OCSP应答器,所以可能会存在请求失败的情况。所以现在有一个叫做:OCSP stapling(OCSP闭合)的技术,该技术可以在tls握手的时候传入本地缓存的OCSP结果。通过这种机制来减少握手的失败率和降低请求时延。

——————————————————————————–

构建私有CA

生成CA端的私钥,私钥位置:/etc/pki/CA/private/cakey.pem

[root@localhost /etc/pki]#(umask 077; openssl genrsa -out ./CA/private/cakey.pem 4096)

Generating RSA private key, 4096 bit long modulus

………………………………….++

…………….++

e is 65537 (0x10001)

生成自签证书

openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655  从私钥中提取出公钥,用公钥生成CA请求,当自己给自己签的时候,加上-x509

选项:

-new:生成新证书签署请求;

-x509:生成自签证书,专用于创建私有CA时

-key:生成请求时用到的私有文件的路径

-out:生成请求文件的路径,如果自签操作将直接生成签署过的证书

-days:证书的有效日期(天)

可以修改:/etc/pki/tls/openssl.cnf 里面的默认配置文件来生成,如果多次生成的话,比较方便

例如:

localityName            = Locality Name (eg, city)

localityName_default        = Beijing

CA私钥位置:/etc/pki/CA/private/cakey.pem

CA自签证书位置:/etc/pki/CA/cacert.pem

为CA提供所需的目录及文件:

#mkdir -pv /etc/pki/CA/{certs,crl,newcerts}

#touch /etc/pki/CA/{serial,index.txt}

#echo 01 > /etc/pki/CA/serial   指明证书编号的开始序列号

——————————CA创建完成—————————

要用到证书进行安全通信的服务器,要向CA请求签署证书:

在云服务器上面进行下面的操作:

[root@cloud /etc/httpd]#mkdir ssl

[root@cloud /etc/httpd]#cd ssl/

[root@cloud /etc/httpd/ssl]#(umask 077; openssl genrsa -out httpd.key 2048)

Generating RSA private key, 2048 bit long modulus

………..+++

………………………………………………………………………+++

e is 65537 (0x10001)

[root@cloud /etc/httpd/ssl]#ll

total 4

-rw——-. 1 root root 1679 Sep 19 20:54 httpd.key

生成请求

[root@cloud /etc/httpd/ssl]#openssl req -new -key httpd.key -out httpd.csr -days 365

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) [CN]:

State or Province Name (full name) [Beijing]:

Locality Name (eg, city) [Beijing]:

Organization Name (eg, company) [MageEdu]:

Organizational Unit Name (eg, section) [Ops]:

Common Name (eg, your name or your server's hostname) [andy-blog.org]:  #必须是自己的域名,不然会出错

Email Address [admin@andy-blog.org]:webmaster@andy-blog.org

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:            #为了请求这些信息的安全,可以将这个请求进行加密,这里输入密码

An optional company name []:

[root@cloud /etc/httpd/ssl]#chmod 600 *

[root@cloud /etc/httpd/ssl]#ll

总用量 8

-rw——-. 1 root root 1062 9月  19 21:06 httpd.csr

-rw——-. 1 root root 1679 9月  19 21:09 httpd.key

服务器私钥位置: /etc/httpd/ssl/httpd.key

服务器证书请求位置: /etc/httpd/ssl/httpd.csr

—————————-请求生成完毕——————————

下面操作在CA电脑上操作

服务器将证书申请发送给CA请求签名

因为CA电脑在局域网里面,云服务器无法远程拷贝到CA电脑,从CA电脑上面将云服务器的请求拷贝下来,因为云主机的端口改变了,要重新指定端口,复制

[root@localhost ~/ssl]#scp -P 23434 root@103.200.30.55:/etc/httpd/ssl/httpd.csr ./

[root@localhost ~/ssl]#ll

total 4

-rw——-. 1 root root 1062 Sep 19 21:23 httpd.csr

[root@localhost ~/ssl]#openssl ca -in httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365    #签过名的用户的证书保存在/etc/pki/CA/certs/目录下面

Using configuration from /etc/pki/tls/openssl.cnf

Check that the request matches the signature

Signature ok

Certificate Details:

        Serial Number: 1 (0x1)

        Validity

            Not Before: Sep 19 13:28:58 2016 GMT

            Not After : Sep 19 13:28:58 2017 GMT

        Subject:

            countryName               = CN

            stateOrProvinceName       = Beijing

            organizationName          = MageEdu

            organizationalUnitName    = Ops

            commonName                = andy-blog.org

            emailAddress              = webmaster@andy-blog.org

        X509v3 extensions:

            X509v3 Basic Constraints: 

                CA:FALSE

            Netscape Comment: 

                OpenSSL Generated Certificate

            X509v3 Subject Key Identifier: 

                CF:E3:0C:8F:EC:50:82:0F:B7:79:1B:4C:01:3A:6B:45:64:EE:06:18

            X509v3 Authority Key Identifier: 

                keyid:CD:41:3D:14:4C:7E:CB:0B:B5:69:F4:01:F2:EA:07:96:FD:07:AA:C0

Certificate is to be certified until Sep 19 13:28:58 2017 GMT (365 days)

Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y

Write out database with 1 new entries

Data Base Updated

将签署过的证书远程拷贝到云服务器上,

root@localhost /etc/pki/CA]#scp -P 23123 ./certs/httpd.crt root@103.200.30.55:/etc/httpd/ssl

[root@localhost /etc/pki/CA/certs]#openssl x509 -in httpd.crt -noout -serial -subject     查看签署过的证书的信息。

serial=01

subject= /C=CN/ST=Beijing/O=MageEdu/OU=Ops/CN=andy-blog.org/emailAddress=webmaster@andy-blog.org

  

吊销列表没有写

服务器端配置

[root@cloud /etc/httpd/conf.d]#yi mod_ssl  安装https模块

[root@cloud /etc/httpd/conf.d]#vim ssl.conf   配置文件

修改配置文件到指定位置

ServerName andy-blog.org

SSLCertificateFile /etc/httpd/ssl/httpd.crt

SSLCertificateKeyFile /etc/httpd/ssl/httpd.key

[root@cloud ~]#service httpd restart

查看监听端口是否有443端口

[root@cloud ~]#netstat -tnlp

tcp        0      0 :::443 

用浏览器访问https://andy-blog.org

提示证书不受信任,将CA服务器的自签证书(/etc/pki/CA/cacert.pem)拷贝到windows上面,

改名字  cacert.pem为cacert.crt  添加道浏览器的信任目录里面,就可以正常访问了。

参考文档:http://seanlook.com/2015/01/18/openssl-self-sign-ca/

http://www.cnblogs.com/f-ck-need-u/p/7113610.html

http://www.cnblogs.com/f-ck-need-u/p/7115871.html

http://www.cnblogs.com/f-ck-need-u/category/912772.html

未经允许不得转载:江哥架构师笔记 » openssl生成自签证书

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址