记录我的成长吧~

推荐连接

 

PKI及创建私有私有CA


先上图:

PKI公钥基础设施

以CA为核心生产的另一套架构体系:PKI    Public  Key Infrastructure

签证机构:CA
    用户在注册机构注册证书,CA就会签发用户的公钥认证,并且和申请者的信息绑定在一起并且签名后,以证书形式发给申请者,然后在本地的证书存取库备份。(可以理解成现实社会的公安部)
注册机构:RA
    一般用户都是在这里注册证书(可以理解成现实社会的派出所)
证书吊销列表:CRL
    如果用户私钥丢失,必须要申请吊销证书,否则可能会被别人冒名顶替。
证书存取库:
    所有发出的证书都会在这里存一份,如果丢失证书可以在这里得到,如果丢失私钥那么只能申请证书撤销

X.509v3

定义了证书的结构以及认证协议标准

版本号:标识证书的版本
序列号:标识证书的唯一证书,类似于身份证
签名算法ID:证书的算法标识
发行者名称:证书颁发这的可识别名
有效期限:证书有效的时间段
主体名称:证书拥有着的可识别名
主体公钥:关键部分
发行者的唯一标识:证书颁发者的唯一标识符
主体的唯一标识:证书拥有者的唯一标识符
扩展信息
发行者的签名:证书颁发者对证书的签名,上述整个内容做单向加密,得到的特征码用自己私钥加密,并附加到后面,用来生产发行者的签名;

数字证书CA

  公钥在网络传输过程中,无法保证可信度,容易被窃取或伪装,所以我们就需要一个受信任的第三方机构(CA),来保证公钥信息的安全分发。
  如果用户想得到一份属于自己的证书,他应先向 CA 提出申请。在 CA 判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者。
  如果一个用户想鉴别另一个证书的真伪,他就用 CA 的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。证书实际是由证书签证机关(CA)签发的对用户的公钥的认证。
  问题:机构A发给用户A证书,机构B发给用户B证书,那么用户A和B还是不信任的,这个时候就需要有一个根CA,让所有证书颁发机构都信任根,用户就可以通过查询根得知此证书是否可信;如何保证用户在获取CA证书的时候被劫持,这点不用担心,操作系统提供商如微软的Windows在安装完成操作系统的时候就自动让你的计算机信任了根CA
有了根CA之后,证书颁发机构信任根CA,不同证书颁发机构只要信任根CA那么颁发的证书都是受信任的。

SSL/TLS协议:

  • SSL:安全套接字层(ssl 1.0,ssl 2.0,ssl 3.0)
  • TLS:传输层安全( tls 1.0,tls 1.1,tls 1.2,tls 1.3)

OpenSSL组成

  • libcrypto 加密解密库
  • libssl  ssl库
  • openssl 多用途命令行工具

SSL会话主要三步:

1、客户端向服务器端索要并验证证书;
2、双方协商生成"会话密钥";
3、双方采用"会话密钥"进行加密通信;

SSL Handshake Protocol:(ssl会话1、2步)
第一阶段:ClientHello:发送
    支持的协议版本,比如tls 1.2;
    客户端生成一个随机数,稍后用户生成"会话密钥"
    支持的加密算法,比如AES,3DES,RSA;
    支持的压缩算法                

第二阶段:ServerHello:回应
    确认使用的加密通信协议版本,比如tls 1.2;
    服务器端生成一个随机数,稍后用于生产"会话密钥"
    确认使用的加密方法;
    服务器证书;
    (索要客户端证书)

    
第三阶段:
    验正服务器证书,在确认无误后取出其公钥;(发证机构、证书完整性、证书持有者、证书有效期、吊销列表)                
    发送以下信息给服务器端:
        一个随机数;
        编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
        客户端握手结束通知;
        
第四阶段:
    收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有到的“会话密钥”;
    向客户端发送如下信息:
        编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;
        服务端握手结束通知;

OpenSSL

组件:

libcrypto, libssl主要由开发者使用;
openssl:多用途命令行工具;

openssl命令:
 子命令,分为三类:
  标准命令:enc,ca,req,genrsa,...
  消息摘要命令(dgst子命令)
  加密命令(enc子命令) 

查看使用帮助:whatis enc ... ; man enc ...

[root@centos7 ~]# openssl ?
openssl:Error: '?' is an invalid command.

Standard commands 标准命令
asn1parse         ca                ciphers           cms               
crl               crl2pkcs7         dgst              dh                
dhparam           dsa               dsaparam          ec                
ecparam           enc               engine            errstr            
gendh             gendsa            genpkey           genrsa            
nseq              ocsp              passwd            pkcs12            
pkcs7             pkcs8             pkey              pkeyparam         
pkeyutl           prime             rand              req               
rsa               rsautl            s_client          s_server          
s_time            sess_id           smime             speed             
spkac             ts                verify            version           
x509              

Message Digest commands (see the `dgst' command for more details) 消息摘要命令
md2               md4               md5               rmd160            
sha               sha1              

Cipher commands (see the `enc' command for more details) 加密命令
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb       
aes-256-cbc       aes-256-ecb       base64            bf                
bf-cbc            bf-cfb            bf-ecb            bf-ofb            
camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  camellia-192-ecb  
camellia-256-cbc  camellia-256-ecb  cast              cast-cbc          
cast5-cbc         cast5-cfb         cast5-ecb         cast5-ofb         
des               des-cbc           des-cfb           des-ecb           
des-ede           des-ede-cbc       des-ede-cfb       des-ede-ofb       
des-ede3          des-ede3-cbc      des-ede3-cfb      des-ede3-ofb      
des-ofb           des3              desx              idea              
idea-cbc          idea-cfb          idea-ecb          idea-ofb          
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc           
rc2-cfb           rc2-ecb           rc2-ofb           rc4               
rc4-40            seed              seed-cbc          seed-cfb          
seed-ecb          seed-ofb          zlib     
openssl ?

 

对称加密:

工具:openssl  enc,  gpg
支持的算法:3des, aes, blowfish, towfish

enc命令:
    加密:openssl enc -e -CIPHERNAME -a -salt -in /PATH/FROM/SOMEFILE -out /PATH/TO/SOMECIPHERFILE
        参数说明:
        -e:表示加密
        -CIPHERNAME:表示使用的算法
        -salt:加入"佐料"
        -a:bash64文本编码格式,不加-a就是二进制编码格式;
        -in:加密的文件
        -out:加密后的文件
    解密:openssl enc -d -CIPHERNAME -a -salt -in /PATH/FROM/SOMECIPHERFILE -out /PATH/TO/SOMEFILE
        参数说明:
        -d:表示解密
        -CIPHERNAME:表示使用的算法
        -in:表示解密的文件
        -out:表示解密后的文件

    加密:~]# openssl  enc  -e  -des3  -a  -salt  -in fstab   -out fstab.ciphertext
    解密:~]# openssl  enc  -d  -des3  -a  -salt  -out fstab   -in fstab.ciphertext
演示:对称加密解密
[root@centos7 scripts]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext  加密
enter des-ede3-cbc encryption password:        #输入密码
Verifying - enter des-ede3-cbc encryption password:  #确认密码
[root@centos7 scripts]# cat fstab.ciphertext
U2FsdGVkX19q4VpN/QX7RTSmrhKaZzOPX1tZM5evDzrqD1pQCew8RxWgopV2fmZg
MzN6RrfUn+r/eOQziyrxWreed1FOZaOqWnu3uApQv+834sE3vjosM5BdTtHVuIdY
9M43iqP2pNs/6/x8RrhM0l6Z6FMoVHf4XylIM3rPeFg7taeumwDwyEBD7h/zDm12
+HPVsjLkeqO7we/gY8oUJX9R2jMPuqxVYcwORlHtA/+0tdlKe2Yg/r6KuVsSqVZj
1ak1NO6CErqHMHMJbLgraZzUxSw+Sj4MWb5Ktdgohw8idXMtiGP4eCl+p6fm0ByF
92zZPMVALnzLxpa1Zgj+P7I2R45Ha7uSauXOO+j9mhqyvqU5kV3M5kMb+YcsLOaC
bPkZUEMLC1jd9mHEmXa/IBQRL8/2mR5iO9s29lIv+iuzVPkUYIIOzXKk/70sSEQs
egq8TBwbIPAXMfMh8bcQCiNML/Erk7LyBYTPpCpjYY7ohOGF43/Tv8Tv8g+Rngw1
fX+n9W9tC3V6tBwLNY2szbcwdC/3uyaz6ypG9U2TSzV2PXv1wXKxf3MrEJpt75do
hXFhhm6iUQLm5KhG3itTAk9Vw49tcyzqYv0dk6w8e1zhwd5Aja5u5blNVxs4AkGB
Evq9ar9NtAh3Xm0yskXJSmOwrhLwj8m6lZLow9qQ8g+psRprPVt4kF73BIiquKIv
skZfvmyLwZLh2TnL2yR1cNmAG4uSfCg+b7gX5+LauvKyGCztuzHx9WGNpoodLdZb
+B1z28bB00M/JcOLBjb9SF2/LRty2ehJoqJqbgM4Exu3Ot6tODh+wg==
[root@centos7 scripts]# openssl enc -d -des3 -a -salt -out fstab.plaintext  -in fstab.ciphertext  解密
enter des-ede3-cbc decryption password:            #输入密码
[root@centos7 scripts]# cat fstab.plaintext 

#
# /etc/fstab
# Created by anaconda on Thu Dec 10 08:41:34 2015
#
# 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=bb5e9683-2846-4cc0-970a-d855a901cfb8 /                       xfs     defaults        0 0
UUID=55bee71d-fa56-4e6b-8230-5328c19dbf6b /boot                   xfs     defaults        0 0
UUID=51573532-4998-4892-97f8-85338c87d39d /usr                    xfs     defaults        0 0
UUID=7754eaa6-9ed3-419c-9be3-732c0f0557a3 swap                    swap    defaults        0 0
演示:oepnssl对称加密解密

单向加密:

工具:openssl dgst, md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum

dgst命令:
    openssl dgst -md5 /PATH/TO/SOMEFILE
演示:提取fstab文件的特征码
[root@centos7 scripts]# md5sum fstab   #md5sum命令
4bc58d8550554654fb2eaf4616cfe023  fstab

[root@centos7 scripts]# openssl dgst -md5 fstab   #openssl dgst生成特征码
MD5(fstab)= 4bc58d8550554654fb2eaf4616cfe023

[root@centos7 scripts]# echo "hello world" | openssl dgst -md5  #直接计算数据特征码
(stdin)= 6f5902ac237024bdd0c176cb93063dc4
演示:提取fstab文件的特征码

生成用户密码:

工具:passwd, openssl  passwd

passwd命令:
    openssl  passwd  -1  -salt  SALT
    说明:就算密钥一样,只要salt的随机数不一样,那么输出的加密密码就是不一样的,也就无法反推出密码。
        不支持-6 sha512算法
演示:生成用户密码
[root@centos7 scripts]# openssl passwd -1 -salt 12345678
Password: 
$1$12345678$qC3FkBB/fvNXSO1sQEM5o1
[root@centos7 scripts]# openssl passwd -1 -salt 12345679
Password: 
$1$12345679$9LIaq1TxKlBWlZDDfzNqO.

[root@centos7 scripts]# perl -e 'print crypt ("emacle2013",q($1$12345678)),"\n"' #perl也可以指定salt生成密码
$1$12345678$qC3FkBB/fvNXSO1sQEM5o1

[root@centos7 scripts]# openssl passwd -1 -salt $(openssl rand -hex 4) #openssl rand生成随机数
Password: 
$1$21a5692b$u0S4js1zIm6F54GgYy0Ll/
演示:生成用户密码

生成随机数:

工具:openssl  rand

~]# openssl  rand  -hex  NUM
~]# openssl  rand  -base  NUM
演示:生成随机数:        
[root@centos7 scripts]# openssl rand -base64 10 #真正使用时把==去掉就可以了
Gu4w9zn7pholPA==
[root@centos7 scripts]# openssl rand -base64 10
jRIQEQp0OMqghg==
[root@centos7 scripts]# openssl rand -hex 4
bced0c1c
[root@centos7 scripts]# openssl rand -hex 4
81c91004
演示:生成随机数:

 

加密依赖随机数:
Linux系统上的随机数生成器:
    /dev/random:仅从熵池返回随机数;随机数用尽,阻塞;
    /dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞;
        伪随机数不安全;

        熵池:内核在内存中维护的一段内存空间;
        熵池中随机数的来源:
            硬盘IO中断时间间隔;
            键盘IO中断时间间隔;

[root@centos7 scripts]# head -1 /dev/urandom 
ˣݓA«4˻m
ą]¹`֯㮕þe8쩮th6iJދµSQ¶µ㊕짋6ѽ͙=zֳ᏾커u@­z k½wv³pEtG´»¬dӻ੨҈ꗶz

[root@centos7 scripts]#  head -200 /dev/urandom | cksum | cut -f1 -d" "
668634837
#cksum 将读取文件内容,生成唯一的表示整型数据,只有文件内容不变,生成结果就不会变化,与php crc函数
Linux系统上的随机数生成器

公钥加密:

加密解密
    算法:RSA,ELGamal
    工具:openssl rsautl,gpg

数字签名
    算法:RSA,DSA,ELGamal
    工具:openssl rsautl,gpg
密钥交换
    算法:DH

生成密钥:
    生成私钥: ~]# (umask 077;  openssl  genrsa  -out  /PATH/TO/PRIVATE_KEY_FILE  NUM_BITS)
    提出公钥: ~]#  openssl  rsa  -in  /PATH/FROM/PRIVATE_KEY_FILE  -pubout
    注意:在bash命令行上放在小括号中执行的命令,其实是通过打开一个子shell进程进行的;    
        NUM_BITS支持位数512、768102420484096...必须是2^n倍的位数;
        公钥是从私钥里提取出来的;    
演示:1024 公钥加密
[root@centos7 scripts]# openssl genrsa 1024   #生成私钥
Generating RSA private key, 1024 bit long modulus
................++++++
...........++++++
e is 65537 (0x10001)
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDAKr56HlpEZVi5/MQh6yhClLmLXZajS6xx0gyLmYDbFy4NWswG
Ruy91N9YJZfOlN/vzgEOl7gq++Vq8AEao0NGqzpFIjJ4uKg2QwtrMtFIOgfTaI94
K3I/Q080pxkE9yj13p8BtA9n6YrrkmIZNaWcni2nndExy62vHZR3d82nFwIDAQAB
AoGAc/HWV2w03oufiyg9VpHCCtodUT84gnJIK6ymsRv/KTHFMX2VGDx23tqvn0mf
XJ9qtg+/h4R3NEgj1e/VWrMjBVZPkFZNJKYjNfPTHRQ2SbnhFocOe4y1ii0tekFS
ZgA2wEAyJd9/qSicoznZbtMRL9RW/DxOJZz25eklCediqxECQQDtGfpxGAYtlxwZ
YQTVG81IJQyYGj1uyL91rTDktIIw3cJNudLnub13E9GB27oVtjwamyUGBC4CAbwZ
I4L8fBTTAkEAz3viL/KjaiPqWeDG1b5MZRF6dR1H7GvSKZf4c0mYhhDGoE0URP1Q
yqg6gn2+YcBAo27E6yVzsT9534hVMINKLQJBAMD9RDyJsX2qYdTGg4hy+MSgY3/q
29Yw0KaYMhP2WYIs/tsFRgYXyYADQaTRlMXXb1S4s4oSHODFSLWtkhCxbsECQEFN
mYRD1yEqCrGdKJfPnFXXKXbA74k+6lfDCCSpDkNr9kgv2mhYXlxalIfLsecsTmvi
CkKEeCRaeS5cx4tMV0UCQQDPjhaYU31XZn9HVna0Z+tVZivQC2dFRTn0Uy5z+FqY
ycgfJVfiTFH2uEgJucrNWwlNiIPGBq3zrhqq1prhSPOr
-----END RSA PRIVATE KEY-----
[root@centos7 scripts]# openssl genrsa 1024 > /tmp/mykey.private
Generating RSA private key, 1024 bit long modulus
..++++++
................................++++++
e is 65537 (0x10001)

[root@centos7 scripts]# openssl genrsa -out /tmp/mykey2  1024
Generating RSA private key, 1024 bit long modulus
..++++++
.......++++++
e is 65537 (0x10001)

[root@centos7 scripts]# ls -l /tmp/mykey*    #密钥应该只有自己可读写
-rw-r--r--. 1 root root 887 1月   6 15:56 /tmp/mykey2
-rw-r--r--. 1 root root 887 1月   6 15:54 /tmp/mykey.private

[root@centos7 scripts]# (umask 077;openssl genrsa -out /tmp/mykey3  1024)  #生成私钥
Generating RSA private key, 1024 bit long modulus
.........++++++
................................++++++
e is 65537 (0x10001)
[root@centos7 scripts]# ls -l /tmp/mykey*
-rw-r--r--. 1 root root 887 1月   6 15:56 /tmp/mykey2
-rw-------. 1 root root 887 1月   6 15:58 /tmp/mykey3
-rw-r--r--. 1 root root 887 1月   6 15:54 /tmp/mykey.private

[root@centos7 scripts]# openssl rsa -in /tmp/mykey3  -pubout   提出公钥
writing RSA key
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCeUWS16lcqVU92xToDl48WWTPO
fdFAdpuQbvT6fLgWHI+pz6uRoqHjbZRmKbNqsM6OP+pxaNhbyanhhT19cNDLQvfR
PIVEvhC9JPg35Clh99DxyOkSZFqRxG0tuPCdSMOK2YKaH4pMxc4iHOIoMCy73qPD
sYiUJmluIpH0Pw/IYQIDAQAB
-----END PUBLIC KEY-----
演示:1024 公钥加密

 

CA

公共信任的CA,私有CA;

建立私有CA:

openssl命令
OpenCA工具:二次封装openssl

1、生成私钥
2、生成自签署证书,并为CA提供所需要的目录及文件即可

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

####################################################################
[ ca ]
default_ca    = CA_default        # The default ca section

####################################################################            
[ CA_default ]
dir = /etc/pki/CA            #指明CA的工作目录
certs = $dir/certs           #以颁发证书的存储目录位置
crl_dir = $dir/crl           #已吊销证书的吊销列表的存储目录位置
database = $dir/index.txt    #证书索引文件 
new_certs_dir = $dir/newcerts    #新创建证书存放目录位置 
certificate = $dir/cacert.pem    #CA自己证书的存放位置 
serial = $dir/serial    #序列号,证书生成就从这里获得序列号,每签署一个序列号自动加一
crlnumber = $dir/crlnumber    #定义证书吊销编号
crl = $dir/crl.pem    #当前正在使用的crl
private_key = $dir/private/cakey.pem    #CA自己的私钥文件
RANDFILE = $dir/private/.rand    #随机数的获取位置

default_days    = 365            #默认有效期365天
default_crl_days= 30            #默认吊销列表存放时间
default_md    = sha256        #默认摘要算法sha256
####################################################################
[ req ]  向证书签发机构的签署请求
default_bits        = 2048
default_md        = sha256
default_keyfile     = privkey.pem
distinguished_name    = req_distinguished_name
attributes        = req_attributes
x509_extensions    = v3_ca    # The extentions to add to the self signed cert
/etc/pki/tls/openssl.cnf
步骤:
(1) 生成私钥;私钥用于签发证书时,向证书添加数字签名使用
    ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
(2) 生成自签证书;每个通信方都导入此证书至“受信任的证书颁发机构”
    ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
        -new:生成新证书签署请求;
        -x509:生成自签格式证书,专用于创建私有CA时;
        -key:生成请求时用到的私有文件路径,自动抽签公钥;
        -out:生成的请求文件路径;如果自签操作将直接生成签署过的证书;
        -days:证书的有效时长,单位是day;
(3) 为CA提供所需的目录及文件;
    ~]# mkdir  -pv  /etc/pki/CA/{certs,crl,newcerts}
    ~]# touch  /etc/pki/CA/{serial,index.txt}
    ~]# echo  01 > /etc/pki/CA/serial
演示:
(1) 生成私钥
[root@centos7 scripts]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
Generating RSA private key, 4096 bit long modulus
.....................................................................................................................................................................++
........................++
e is 65537 (0x10001)
[root@centos7 scripts]# ls /etc/pki/CA/private/cakey.pem  -l
-rw-------. 1 root root 3243 1月   9 13:31 /etc/pki/CA/private/cakey.pem
(2) 生成自签证书
[root@centos7 scripts]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem  -out /etc/pki/CA/cacert.pem -days 3655
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]:Beijing  #市
Organization Name (eg, company) [Default Company Ltd]:YY  #公司
Organizational Unit Name (eg, section) []:Ops   #部门
Common Name (eg, your name or your server's hostname) []:ca.server.com   #主机名
Email Address []:caadmin@server.com  #管理员邮箱
[root@centos7 scripts]# ls /etc/pki/CA
cacert.pem  certs  crl  newcerts  private
(3) 为CA提供所需的目录及文件
[root@centos7 ~]# mkdir  -pv  /etc/pki/CA/{certs,crl,newcerts}
[root@centos7 ~]# touch  /etc/pki/CA/{serial,index.txt}
[root@centos7 ~]# echo  01 > /etc/pki/CA/serial
演示:创建私有CA

请求签署证书

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

步骤:(以httpd为例)
(1) 用到证书的主机生成私钥;
    ~]# mkdir  /etc/httpd/ssl 
    ~]# cd  /etc/httpd/ssl
    ~]# (umask  077; openssl  genrsa -out  /etc/httpd/ssl/httpd.key  2048)
(2) 生成证书签署请求
    ~]# openssl  req  -new  -key  /etc/httpd/ssl/httpd.key  -out /etc/httpd/ssl/httpd.csr  -days  365
    注意:
        (a) 其中的subject信息部分,要与CA的保持一致;
        (b) Common Name要使用此主机在通信真实使用名字;
        (c) csr在得到CA证书后可以保留可以删除

(3) 将请求通过可靠方式发送给CA主机;
    可以通过ssh协议,或者其他安全的方式发给CA        
(4) 在CA主机上签署证书;
    ~]# openssl ca  -in  /tmp/httpd.csr  -out  /etc/pki/CA/certs/httpd.crt  -days  365
     csr:Certificate Signing Request证书签名请求的简写
     crt:Certificate证书的简写

    查看证书中的信息:
        ~]# openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -serial  -subject
        参数说明:
            x509:子命令
            -in:读取文件
            -noout:输出
            -serial:查看证书序列号
            -subject:查看证书主题标识
演示:
(1) 用到证书的主机生成私钥
[root@centos7 ~]# mkdir  /etc/httpd/ssl  -p
[root@centos7 ~]# cd /etc/httpd
[root@centos7 httpd]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
..............................................................................+++
......................................+++
e is 65537 (0x10001)
[root@centos7 httpd]# ls /etc/httpd/ssl/httpd.key  -l
-rw-------. 1 root root 1675 1月   9 13:48 /etc/httpd/ssl/httpd.key

(2) 生成证书签署请求
[root@centos7 httpd]# openssl req -new -key /etc/httpd/ssl/httpd.key  -out /etc/httpd/ssl/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) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:YY
Organizational Unit Name (eg, section) []:Ops  
Common Name (eg, your name or your server's hostname) []:www.emacle.com
Email Address []:webmaster@emacle.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@centos7 httpd]# ll /etc/httpd/ssl/
总用量 8
-rw-r--r--. 1 root root 1054 1月   9 13:54 httpd.csr
-rw-------. 1 root root 1675 1月   9 13:48 httpd.key

(3) 将请求通过可靠方式发送给CA主机                        
(4) 在CA主机上签署证书
[root@centos7 ~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
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: Jan  9 06:11:09 2016 GMT
            Not After : Jan  8 06:11:09 2017 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Beijing
            organizationName          = YY
            organizationalUnitName    = Ops
            commonName                = www.emacle.com
            emailAddress              = webmaster@emacle.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                D3:AE:5A:58:44:BF:94:A8:82:7B:CD:69:18:A6:64:EB:FF:EE:86:9A
            X509v3 Authority Key Identifier: 
                keyid:51:DF:B3:92:F8:44:77:94:4A:AF:11:FB:9C:B7:20:E0:C8:38:6F:AE

Certificate is to be certified until Jan  8 06:11:09 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@centos7 ~]# cat /etc/pki/CA/index.txt
V    170108061109Z        01    unknown    /C=CN/ST=Beijing/O=YY/OU=Ops/CN=www.emacle.com/emailAddress=webmaster@emacle.com
V:表示已签过
查看证书中的信息
[root@centos7 ~]# openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -serial  -subject
serial=01
subject= /C=CN/ST=Beijing/O=YY/OU=Ops/CN=www.emacle.com/emailAddress=webmaster@emacle.com
演示:向CA请求签署证书

吊销证书:

步骤:
(1) 客户端获取要吊销的证书的serial(在使用证书的主机执行):
    ~]# openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -serial  -subject
(2) CA主机吊销证书
    先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;
    
    吊销:
        # openssl  ca  -revoke  /etc/pki/CA/newcerts/SERIAL.pem
        
            其中的SERIAL要换成证书真正的序列号;
[root@centos7 ~]# ls /etc/pki/CA/newcerts/
01.pem
        
(3) 生成吊销证书的吊销编号(第一次吊销证书时执行)
    # echo  01  > /etc/pki/CA/crlnumber

(4) 更新证书吊销列表
    # openssl  ca  -gencrl  -out  thisca.crl 
        参数说明:
            -gencrl:生成证书吊销列表
            -out:输出文件
    
    查看crl文件:
        # openssl  crl  -in  /PATH/FROM/CRL_FILE.crl  -noout  -text

 

这个证书制作好后我们就可以在windows下安装我们制作好的证书了:

windows没配服务,这里以linux的apache服务为例访问443端口:

apache服务:开启ssl

1vi /usr/local/apache/conf/httpd.conf
去掉这行注释
Include conf/extra/httpd-ssl.conf
2vi /usr/local/apache/conf/extra/httpd-ssl.conf 
修改以下两项,将openssl生成的证书cp到相应路径(/etc/httpd2/)
SSLCertificateFile "/etc/httpd2/httpd.crt"
SSLCertificateKeyFile "/etc/httpd2/httpd.key"
ServerName www.emacle.com:443
3、重启服务
apachectl start

 

在浏览器里输入https://www.emacle.com就会看到证书的效果了;

 

参考:
openssl官网:http://www.openssl.org/
Transport Layer Security:https://en.wikipedia.org/wiki/Transport_Layer_Security

 

 

转发请注明出处:http://www.cnblogs.com/jasperhsu/p/5115357.html

posted on 2016-01-09 02:05  徐长伟  阅读(3003)  评论(0编辑  收藏  举报