欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 18_02 _ssl协议、openssl及创建私有CA 有大用

image.png

私钥丢失以后怎么办

私钥的丢失会导致证书的失效,任何基于此证书与用户进行的通信都应该失效的


CRL:证书吊销列表 ( Certificate Revocation List ) 

此前曾经发出去的证书,但仍未过期,只不过己经被撤销了(因为各种原因)

事实上证书是有有效期的,证书颁发机构的名称,证书颁发机构的签名

image.png


image.png

但是互联网上的用户绝大多数 会忽略这一点(不去CRL那边查询),所以就算有证书,也未心能够保证每一次通信

都是安全的,证书撤销列表是保证证书安全性的一个非常重要的措施,

我们每一次使用证书之前,都应该去检测有效性的


因此一个证书颁发机构包含其证书撤销列表等等CA间的(证书颁发机构间的信任关系)组合起来构成了整个PKI

系统的核心


PKI: Public Key Infrastructure  公钥基础设施  就是定义了CA以及CA彼此间的信任关系,还有CA的证书吊销列表

CA: Certificate Authority 证书颁发机构 (证书权威机构)

PKI的核心正是 CA 


不同标准下的证书,它的格式是不相同的

目前比较流行的证书存储格式 : x509  还有 pcks12 等


最标准,最通行的格式 x509

一般来说包含:

        公钥,有效期限,

        证书的合法拥有者

        证书该如何被使用(证书的使用是有限定的,不能随意的使用,可以用在通信当中,或者用在什么样什么样的过程当中,都是有限定的,比如有时证书可以拿来签名,有时证书可以拿来加密(当然加密解密与算法相关,与证书本身没有关系))

        CA的信息(证书颁发者自身的信息)(哪个机构,公司名字,地址,服务器地址等)

        CA签名的校验码(CA的签名,CA的戳)(CA使用私钥签名)(证明这个证书是某CA颁发的)


PKI 的一种实现:  互联网上著名的安全机制 TLS/SSL,他们使用的是x509的证书


PKI 的另一种实现:  OpenGPG:这是PKI的另外一种实现架构,证书管理机制 ( OpenGPG与x509的格式是差不多的 )


它们实现证书的管理机制不同,CA之间的信任关系的传递机制略有不同,


TLS/SSL 到底是什么 Handshake  如何实现握手认证( Handshake ) 密钥交换等各种功能


TCP/IP五层模型的协议 (不规范,但是实用)

5)应用层 (http,smtp,ftp )

4)传输层  (TCP/UDP)

3)网络层(互联网层)  (封装ip  源ip 目标ip) IP层

2)数据链路层  #  1层和2层可以看作同一层

1)物理层 #  1层和2层可以看作同一层


OSI的7层从上到下分别是 (规范,但不实用)

7 应用层 (具体的应用,比如 web 服务,使用 http 协议)
6 表示层 (在传输的时候 加密 解密 是否压缩)
5 会话层 (双方怎么建立会话的)(讲到应用程序的时候再说吧)
4 传输层  (源端口 目标端口)  
3 网络层 (封装ip  源ip 目标ip)
2 数据链路层 (加mac的报文   源mac,目标mac  

1 物理层 (封装数据报文的前导码 )



image.png





TCP 4层 (把 2)数据链路层 1)物理层 看作一层) OSI 7层

TCP/IP五层模型的协议 (不规范,但是实用)

5)应用层 (http,smtp,ftp )

4)传输层  (TCP/UDP)

3)网络层(互联网层)  (封装ip  源ip 目标ip) IP层

2)数据链路层     #  1层和2层可以看作同一层

1)物理层     #  1层和2层可以看作同一层



image.png



image.png

ssl: Secure Socket Layer 安全的套接字层

SSLv1,SSLv2,SSLv3 

事实上 sslv1 现在已经不使用了

TCP层和应用层之间引入了半个层,叫SSL它只是一个库,


ssl 只是一个库,要想实现SSL的功能,只需要在我们的系统上提供 ssl 相关的库文件就可以了

(就能够将http封装成https)

让上层的应用层的某种协议(如http)在传输数据到下一层的TCP层之前,调用了SSL的功能,

那么这个协议就可以实现加密的功能了,

就能够将 http 封装为  https ,就可以支持https协议了

众多应用层的明文协议,都可以通过调用SSL的功能来实现数据的安全传输的


http 80 可以这样理解 加密 https 443 端口

https 是 443 端口,因为与http的端口 80,及它们的套接字都是不相同的

smtp 可以这样理解 加密 smtps

ftp 可以这样理解 加密 ftps

http本身是不会经由ssl封装的,所以https与http是两样不同的协议,但是它们在应用层所实现的功能是一样的,

只是底层的协议站,其它方面不同而已,因为封装多了一个层次(SSL)了

多了一个层次了,所以协议包变大了,所以整个ip包都受到影响的

IP包在某些传输设备上是不能过大的,它是有限定的,所以说http 和 https 是两种不同的协议



image.png


SSL 是只某一家公司的协议,应该是 Netscape (网景公司)的协议

国际标准化组织研究出来了能够在全球流行的,更为开放的,另外一层意义上的真正的通用性协议 TLS

现在只有TLSv1, 相当于SSLv3,它俩实现的原理和机制是差不多的(虽然协议有所不同)

(TLS相当于第四层了)(SSL 相当于第三层半)

以后不加区别的说SSL TLS了,因为有些系统上,它们的实现机制是一样的,虽然协议可能有所不同,

(讲课的时候或者说明问题的时候,不加区别的使用它们,对于某种特定的软件来讲,可的只支持SSL,有的只支持TLS,有的两个都支持,

,我们自己需要为它们选定的加密机制)

TLS: Transport Layer Security 传输层安全

image.png



TCP 三次握

image.png


协商使用哪个协议,和对称加密算法

image.png

这一步的文字描述指的是上图中的,(这一步,见下面文字)验证一下证书是不是我信任的机构颁发的,还要看这个证书是不是完整的,客户端将生成一个会话密钥,https的主要作用在于web服务器的数据传递(会话交换)是通过加密

的方式来实现的,(要对称加密,速度快),(需要一个对密的对称密码)(不是DH ( Diffie-Hellman )密钥交换实现的)(客户端通

过自己的随机数选择生成一个随机的对称密钥)(并且通过Server中的公钥加密这个密码传到server

端)


上图有个前提,就是建立三次握手   


ssl 这里 记住我们没有使用DH ( Diffie-Hellman )算法


公钥加密可以实现两种功能:1)身份验证    2)加密数据   当然还有 密钥交换



对称加密:

    使用同一个密码,


    而众多的对称加密算法当中的算法

         DES: Data Encrption Standard(数据加密标准) 56bit密钥长度 比较早的成熟的对称加密算法(美国国家安全局在征集加密算法的时候,由IBM公司所提供的一种算法,叫做数据加密标准,这是公开可以使用的)

         大概在2000年左右,人们可以轻而易举的使用性能较强的计算机去暴力破解DES加密,至此,DES加密算法已经很少用了,因为它很不安全了

        3DES (DES3): ( Triple DES )三重DES,这是目前用得比较多的加密算法, ( Triple 三倍的 ),安全性是3倍吗?很难说,人们不会特别信任它的安全性

        AES: Advanced Encrption Standard 高级加密标准,128位的密钥,安全性比较高

                有几个变种

                    AES192,AES256,AES512,            (密钥长度越长,安全性越高,但是速度越慢,所以合适的才是最好的)

        Blowfish:



加密的时候,并不是按位bit加密的,而是把数据分成大小相同的数据块进行加密的



单向加密:  (摘要算法) 摘要表示 生成的结果不多 比如只有 128bit,160bit等,摘要还表示是不能还原的

    MD4

    MD5     128位定长输出

    SHA1    160位定长输出 

    SHA192,SHA256,SHA384,有没有SHA512?        (数字指的是输出长度)(192等不是密码长度,指的是输出长度)

    CRC-32,循环冗余检验码  不是一种加密算法,它只是一种检验码的检验机制,而且用的非常广泛,所以它不提供任何安全性



单向加密,输入不一样,输出却一样,意味着?撞车,一般单向加密,绝不允许这种情况发生的,但CRC-32是可能会出现的,因为CRC-32不是为了加密,只是为了提供检验功能的



公钥加密:  

    一对密钥:长度是可变化的,512,768,1024,2048,4096,8192都有,越长速度越慢

    可以实现的功能:

                身份认证    (数字签名)

                数据加密

                密钥交换    (它本身是加密的一部分,是加密功能的另外一种体现而已)


公钥加密比较有名的算法两种:

        RSA,既是一种算法,也是一个公司的名称,是三位创始人的名称,既可以加密,又可以签名,现在也基本上属于公开使用的,但它仍然有公司自有的未公开的加强版的RSA (它用得最多,)

        DSA,只能签名,不能加密,是公开的,是美国国家安全局的

        ElGamal,商业版的,需要钱支付购买的



当我们的主机上想使用这种算法的时候,我们需要一种工具,能够在我们的主机上提供这种算法的实现,(具体完成这种算法的工具或程序),我们称之为具体实现,

linux上,不同的加密机制,它们所能够提供的工具是不一样的,

比如能够实现对称加密(也能实现单向加密,同时能实现公钥加密吧)的工具,有叫openssl ,gpg等


OpenSSL:

    OpenSSL 是 SSL 的开源实现,OpenSSL 的功能非常强大,几乎实现了市面上主流的所有加密算法,而且工作性能也非常的好,它的作者就是两个年轻人,后来其中一人维护,后来此人被ISA公司聘用了,所以他又为ISA公司实现了一种更强版本的SSL,当然是商业的 SSL,但是事实上 OpenSSL功能很好,很强大

    OpenSSL 是个软件,由三部分组成

            1) libcrpto: (通用加密库),任何软件要想使用加密功能,只需要链接到 libcrpto 就可以调用加密功能,不用自己开发

                            它提供了各种加密函数


            2) libssl: TLS/SSL协议的实现,正是由于有了它,我们的linux上也可以使用https等协议,这是一种基于连接的,能够实现认证,数据安全传输及会话完整性的工具,所以SSL本身是基于会话来实现的 (基于会话的,实现身份认证,数据机密性和会话完整性的TLS/SSL库) (就是上面的那个半层里面的东西吧)

            

            3) openssl:这是一个命令行工具,全天候,多用途的多功能的命令行工具,openssl能够实现单向加密,对称加密,非对称加密,还能够帮你生成一堆密钥,还可以实现简单的私有证书颁发机构(买不起证书,想在公司内部实现加密解密,不想买别人的证书,不跟外人通信,只在公司内部完成通信就可以了,因此就需要一个私有的证书颁发机构了,openssl能够帮我们实现的)

                    openssl 命令行工具,是靠诸多子命令实现的,跟yum一样,有很多的子命令, 不同的子命令用于实现不同的功能

    

OpenSSL 的功能非常强大,是linux上最基本的通用工具之一


openssl 实现私有CA

    (如果要实现加密解密通信,现在基本上都要用到证书,公司内部模拟实现https服务器,就得给web服务器发一个证书才行,自己做一个证书)

    (自己给自己做证书,就要用到证书颁发机构,自己给自己的某种应用做证书之前先得实现一个证书颁发机构)

    证书颁发机构,要给别人发证,自己得先有证;

    1),生成一对密钥,把公钥做成证书

    2),生成自签署的证书(自己给自己盖戳)

    前提是要准备好CA环境

    

生成私钥

openssl genrsa -out /PATH/TO/KEYFILENAME NUMBITS

提取公钥  (输出公钥)

openssl rsa -in /PATH/TO/KEYFILENAME -pubout








查看系统是否安装了 openssl        官方网址 https://www.openssl.org/

[root@localhost ~]# rpm -q openssl

openssl-0.9.8e-26.el5_9.1

[root@localhost ~]#

image.png

如果需要新版本的话,下载,编译安装就可以了


查看安装openssl 生成的文件

[root@localhost ~]# rpm -ql openssl

/etc/pki/CA

/etc/pki/CA/private

/etc/pki/tls

/etc/pki/tls/cert.pem

/etc/pki/tls/certs

/etc/pki/tls/certs/Makefile

/etc/pki/tls/certs/ca-bundle.crt

/etc/pki/tls/certs/make-dummy-cert

/etc/pki/tls/misc

/etc/pki/tls/misc/CA

/etc/pki/tls/misc/c_hash

/etc/pki/tls/misc/c_info

/etc/pki/tls/misc/c_issuer

/etc/pki/tls/misc/c_name

/etc/pki/tls/openssl.cnf    #这个配置文件 在红帽上放在 /etc/pki/tls/ 目录下,这个配置文件主要是为了让openssl工作成私有CA的时候用到的,平时我们用命令行的时候用不到它

/etc/pki/tls/private

#上面是配置文件

/lib/.libcrypto.so.0.9.8e.hmac

/lib/.libcrypto.so.6.hmac

#上面是加密库

/lib/.libssl.so.0.9.8e.hmac

/lib/.libssl.so.6.hmac

/lib/libcrypto.so.0.9.8e

/lib/libcrypto.so.6

/lib/libssl.so.0.9.8e

/lib/libssl.so.6

#上面是 libssl 库

/usr/bin/openssl

# 上面是 openssl 命行工具

/usr/lib/openssl

/usr/lib/openssl/engines

/usr/lib/openssl/engines/lib4758cca.so

/usr/lib/openssl/engines/libaep.so

/usr/lib/openssl/engines/libatalla.so

/usr/lib/openssl/engines/libchil.so

/usr/lib/openssl/engines/libcswift.so

/usr/lib/openssl/engines/libgmp.so

/usr/lib/openssl/engines/libnuron.so

/usr/lib/openssl/engines/libsureware.so

/usr/lib/openssl/engines/libubsec.so

/usr/share/doc/openssl-0.9.8e

/usr/share/doc/openssl-0.9.8e/CHANGES

/usr/share/doc/openssl-0.9.8e/FAQ

/usr/share/doc/openssl-0.9.8e/INSTALL

/usr/share/doc/openssl-0.9.8e/LICENSE

/usr/share/doc/openssl-0.9.8e/NEWS

/usr/share/doc/openssl-0.9.8e/README

/usr/share/doc/openssl-0.9.8e/README.FIPS

/usr/share/doc/openssl-0.9.8e/c-indentation.el

/usr/share/doc/openssl-0.9.8e/openssl.txt

/usr/share/doc/openssl-0.9.8e/openssl_button.gif

/usr/share/doc/openssl-0.9.8e/openssl_button.html

/usr/share/doc/openssl-0.9.8e/ssleay.txt

/usr/share/man/man1/asn1parse.1ssl.gz

/usr/share/man/man1/ca.1ssl.gz

/usr/share/man/man1/ciphers.1ssl.gz

/usr/share/man/man1/crl.1ssl.gz

/usr/share/man/man1/crl2pkcs7.1ssl.gz

/usr/share/man/man1/dgst.1ssl.gz

/usr/share/man/man1/dhparam.1ssl.gz

/usr/share/man/man1/dsa.1ssl.gz

/usr/share/man/man1/dsaparam.1ssl.gz

/usr/share/man/man1/ec.1ssl.gz

/usr/share/man/man1/ecparam.1ssl.gz

/usr/share/man/man1/enc.1ssl.gz

/usr/share/man/man1/errstr.1ssl.gz

/usr/share/man/man1/gendsa.1ssl.gz

/usr/share/man/man1/genrsa.1ssl.gz

/usr/share/man/man1/md2.1ssl.gz

/usr/share/man/man1/md4.1ssl.gz

/usr/share/man/man1/md5.1ssl.gz

/usr/share/man/man1/mdc2.1ssl.gz

/usr/share/man/man1/nseq.1ssl.gz

/usr/share/man/man1/ocsp.1ssl.gz

/usr/share/man/man1/openssl.1ssl.gz

/usr/share/man/man1/pkcs12.1ssl.gz

/usr/share/man/man1/pkcs7.1ssl.gz

/usr/share/man/man1/pkcs8.1ssl.gz

/usr/share/man/man1/req.1ssl.gz

/usr/share/man/man1/ripemd160.1ssl.gz

/usr/share/man/man1/rsa.1ssl.gz

/usr/share/man/man1/rsautl.1ssl.gz

/usr/share/man/man1/s_client.1ssl.gz

/usr/share/man/man1/s_server.1ssl.gz

/usr/share/man/man1/s_time.1ssl.gz

/usr/share/man/man1/sess_id.1ssl.gz

/usr/share/man/man1/sha.1ssl.gz

/usr/share/man/man1/sha1.1ssl.gz

/usr/share/man/man1/smime.1ssl.gz

/usr/share/man/man1/speed.1ssl.gz

/usr/share/man/man1/spkac.1ssl.gz

/usr/share/man/man1/sslpasswd.1ssl.gz

/usr/share/man/man1/sslrand.1ssl.gz

/usr/share/man/man1/verify.1ssl.gz

/usr/share/man/man1/version.1ssl.gz

/usr/share/man/man1/x509.1ssl.gz

/usr/share/man/man5/config.5ssl.gz

/usr/share/man/man5/x509v3_config.5ssl.gz

/usr/share/man/man7/des_modes.7ssl.gz

[root@localhost ~]#


查看 openssl 版本号

[root@localhost ~]# openssl version

OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008

[root@localhost ~]#


? 问号是个不存在的子命令, 但是它会把帮助信息显示给我们

[root@localhost ~]# openssl ?

openssl:Error: '?' is an invalid command.


Standard commands    # 标准命令 (内有对称加密命令 rsa dsa )

asn1parse      ca             ciphers        crl            crl2pkcs7

dgst           dh             dhparam        dsa            dsaparam

enc            engine         errstr         gendh          gendsa

genrsa         nseq           ocsp           passwd         pkcs12

pkcs7          pkcs8          prime          rand           req

rsa            rsautl         s_client       s_server       s_time

sess_id        smime          speed          spkac          verify

version        x509


Message Digest commands (see the `dgst' command for more details)  # (Message Digest commands 信息摘要相关的命令) (单向加密相关的命令 md5 sha1 )(摘要的意思是生成的结果很少 128位,160位,256位等,且 不能还原原来的数据)

md2            md4            md5            rmd160         sha

sha1


Cipher commands (see the `enc' command for more details)  #加密命令 (内有对称加密命令 des3 aes)

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         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           rc2            rc2-40-cbc

rc2-64-cbc     rc2-cbc        rc2-cfb        rc2-ecb        rc2-ofb

rc4            rc4-40


[root@localhost ~]#


 openssl speed 它不是说速度进行什么,而是测试一下openssl  对各种加密算法的支持的速度


[root@localhost ~]# openssl speed   (ctrl+c 未执行)

一回车,把支持的所有的算法的在当前主机上的速度都给你测一测,这种速度,其实也可以对当前系统的加密性能进行评估的

这是一个很好的性能评估工具,(如果不跟任何算法的话,对每一种加密算法都进行计算(可能需要很长时间计算),否则你可以跟上一个加密算法比如 3des (或des3 为什么都不行),aes之类的)



[root@localhost ~]# openssl speed des

Doing des cbc for 3s on 16 size blocks: 8487002 des cbc's in 2.99s # 在 cbc 机制下,16字节的大小,在3秒内,可以处理8487002 次

Doing des cbc for 3s on 64 size blocks: 2134420 des cbc's in 2.99s # 在 cbc 机制下,64字节的大小,在3秒内,可以处理2134420 次

Doing des cbc for 3s on 256 size blocks: 537857 des cbc's in 2.98s

Doing des cbc for 3s on 1024 size blocks: 135403 des cbc's in 2.99s

Doing des cbc for 3s on 8192 size blocks: 17639 des cbc's in 2.97s

Doing des ede3 for 3s on 16 size blocks: 3522446 des ede3's in 3.00s

Doing des ede3 for 3s on 64 size blocks: 868986 des ede3's in 2.98s

Doing des ede3 for 3s on 256 size blocks: 217508 des ede3's in 2.98s

Doing des ede3 for 3s on 1024 size blocks: 54127 des ede3's in 3.00s

Doing des ede3 for 3s on 8192 size blocks: 6343 des ede3's in 2.88s

OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008

built on: Mon Feb 25 09:35:58 EST 2013

options:bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) aes(partial) blowfish(idx)

compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -I/usr/kerberos/include -DL_ENDIAN -DTERMIO -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i686 -mtune=generic -fasynchronous-unwind-tables -Wa,--noexecstack -DOPENSSL_USE_NEW_FUNCTIONS -fno-strict-aliasing -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM

available timing options: TIMES TIMEB HZ=100 [sysconf value]

timing function used: times

The 'numbers' are in 1000s of bytes per second processed. # 表示每秒钟

type             16 bytes #这么大16 KB字节的大小     64 bytes    256 bytes   1024 bytes   8192 bytes

des cbc          45415.40k # 通过cbc这种算法机制,可以处理多少k     45686.58k    46205.17k    46372.13k    48652.76k

des ede3         18786.38k # 通过ede3这种算法机制,可以处理多少k        18662.79k    18685.25k    18475.35k    18042.31k


每秒完成处理的数据量是多少KB ,比如8182bytes的数据块 每秒处理能力是 48652.76k,注意,这是的单位不是完成次数,而是数据块大小。 the 'numbers' are in 1000s,不是指 1000秒内完成次数,而是指 数值以 1000为单位进行缩写 (48652.76k 是指  1) 48652.76*1000 吗?还 指 2) 1000 个 8182bytes ,应该是指 2) 吧),这是很多人容易搞错的地方。


加密的时候,并不是按位bit加密的,而是把数据分成大小相同的数据块进行加密的


基于cbc算法,加密多大字节所用的时间

des的实现机制也有不同的方式,有 cbc , ede3 等等

 (我们要把数据分割成相同大小的块,再进行加密的)

[root@localhost ~]# openssl speed 3DES    (当加密算法不存在的时候,提示你可能的值)

Error: bad option or value


Available values:

md2      md4      md5      hmac     sha1     sha256   sha512   rmd160

rc2-cbc  bf-cbc

des-cbc  des-ede3 aes-128-cbc aes-192-cbc aes-256-cbc aes-128-ige aes-192-ige aes-256-ige rc4

rsa512   rsa1024  rsa2048  rsa4096

dsa512   dsa1024  dsa2048

rc2      des      aes      rsa      blowfish


Available options:

-elapsed        measure time in real time instead of CPU user time.

-engine e       use engine e, possibly a hardware device.

-evp e          use EVP e.

-decrypt        time decryption instead of encryption (only EVP).

-mr             produce machine readable output.

-multi n        run n benchmarks in parallel.

[root@localhost ~]#


想查看openssl 子命令 enc ( encryption 加密 )的帮助信息


[root@localhost ~]# whatis enc         提示你是不是 1ssl 的 enc

enc                  (1ssl)  - symmetric cipher routines

[root@localhost ~]# man enc            直接 man enc 就行

(enc - symmetric cipher routines 对称密码程序)image.png


想查看openssl 子命令 passwd 的帮助信息


# whatis passwd  //可以看看这个命令有几个章节的 man 帮助文档

//第5个章节是配置文件的格式说明    


[root@localhost ~]# whatis passwd

passwd               (1)  - update user's authentication tokens

passwd               (5)  - password file

passwd              (rpm) - The passwd utility for setting/changing passwords using PAM

passwd [sslpasswd]   (1ssl)  - compute password hashes

[root@localhost ~]# man 5 passwd      

image.png



[root@localhost ~]# man sslpasswd         ( 这个命令才是看  openssl 子命令 passwd 的帮助文档 )

image.png



看看如何使用 enc 进行加密

[root@localhost ~]# man enc

-ciphername 算法的名字 (密码名字)

-in filename 从哪个文件读出来

-out filename 加密以后,加密的结果保存在哪个文件里

-e (encrypt)加密 (可省略)

-d (decrypt)解密

-a 基于 base64 位的机制进行处理的,因为它是纯文本 (对文本进行base64编码)

( -a  base64 process the data. This means that if encryption is taking

           place the data is base64 encoded after encryption. If decryption is

           set then the input data is base64 decoded before being decrypted.  )

-k ( 小写 k key 感觉是密码passwd,不是密钥,有点混 ,好像是说 密码是在加密前经过程序计算后才得到真正的密钥(真正的密钥是固定长度的,有64/128/256等,是16进制的),算法真正是使用密钥加密,而不是使用密码加密)使用加密密钥 (或者直接回车,它会提示你输入密钥的) ( -k password:指定加密口令,不设置此项时,程序会提示用户输入口令。)

-K (大写K key  感觉这才是真正的密钥)

image.png




[root@localhost ~]# cp /etc/inittab ./

[root@localhost ~]#


[root@localhost ~]# ls

anaconda-ks.cfg           fstab                  sysroot.gz

bincopy.sh                inittab                tiny.1.gz

boot.iso                  install.log            tiny.2.gz

busybox-1.20.2            install.log.syslog     tiny.3.gz

busybox-1.20.2.tar.bz2    ks.cfg                 tiny.4.gz

cofig-2.6.28.5-i686.cfg   ks.cfg-bak             tiny.5.gz

Desktop                   linux-2.6.38.5.tar.gz  tiny.8.gz

dropbear-2013.56          mbr.backup

dropbear-2013.56.tar.bz2  mkdir

[root@localhost ~]#



[root@localhost ~]# openssl enc -des3 -salt -a -in inittab -out inittab.des3          加密 (-e  可以省掉的)

enter des-ede3-cbc encryption password:

Verifying - enter des-ede3-cbc encryption password:

[root@localhost ~]# ls

anaconda-ks.cfg           fstab                  mkdir

bincopy.sh                inittab                sysroot.gz

boot.iso                  inittab.des3           tiny.1.gz

busybox-1.20.2            install.log            tiny.2.gz

busybox-1.20.2.tar.bz2    install.log.syslog     tiny.3.gz

cofig-2.6.28.5-i686.cfg   ks.cfg                 tiny.4.gz

Desktop                   ks.cfg-bak             tiny.5.gz

dropbear-2013.56          linux-2.6.38.5.tar.gz  tiny.8.gz

dropbear-2013.56.tar.bz2  mbr.backup

[root@localhost ~]#

[root@localhost ~]# rm inittab

rm:是否删除 一般文件 “inittab”? y

[root@localhost ~]#

[root@localhost ~]# cat inittab.des3

U2FsdGVkX19GzeccgDUuyQKvd3RiYSIlqRRIT9+9U0CZ2keLYjWoqz7Ofj8Nr3Y1

frb64vPlruYYqRFPR95GzGhe6CcPCzgwggqheSKEmLG8YJXEoYWx8gcOHMZ205I9

w5Yd7kLC2dhDcublsL5WvOl6B2xVc2aLbuIkiE/YvSDNKn7iBSlob4a46FgWsJoO

HEbXmJXOXQ6XP/mLtwCIIl+UWnFKomR0DrP+2QwGnIqhZVu8Y3sdgRxKMbLK4PS0

+6t9AUZlPaJFwXWU4IHIISmWHNrdioK4l39s8uFfIiAvVfPyllshA7lw2uRMSU0p

IeiWbxkuNEJHIMKDd2U4/WhKDRMg75n9bq3j6hed1hpGDPwSVZ5jxUm5cJ30adMu

qTP4lCfYBvn+Iada+IOTUOkfNkiF/Jf6v5JhAheMVjW9tnDyX0IBbgv1ty4zrlUL

vGwkwHLGxmRSjCReqm9rZffMSfzcnruI+kt2tHJoE8dZyEKJwgE4nwDr43wgW59Q

ctWdB333da5BazgjEhHIuqn8X8/rdey5Q82AtdjUrS7KOc2aiUBNEQau5cwZGrlr

7kQXJ/z5LbGtEFV3Q1a97putnBg9JVnmVDvzSCMI1axKAniJh+US5Tyk9qn9ZlFt

/IheKhyQ1RuIoO+m1sggYmPFJW2L9mCHEKCU6mfqOHhMty6zfpvwHymS8+N+CVHE

f7bB+WU/05m1SeOZgECtEg588EZykPP5Dp0JaqXQQ3KSZlO9fTiCPcFH2dzYB2/6

MM2EKVGIQE26AY/A0HQ0OtzM/gQ8t+uk2+J9/7s3jqmlXvqAAnqGvTsCHXf2V9Y2

V1o63O4cPUxETeUDp7BoM4rkja3KL7gkWie6A8PWeWxrHUTQAtyVLePZcCwmdFVV

eu3IuB2KELhqj84nVGASk0gD8JMX3qxDffXs+x9c/t2xTeqmNEjQRUuyMctbKw1s

lw69+1Rux3M44u3tS0QR+GhkLrrMU0yiWwLNjjwTjgTIC0FNe4yQAe1DEmU6nA2M

2FtUOKQOPAYa6o3kN/OHjWuc/yVJoSba5nldV3eGpUkf/P+zMZv2NYXiTDWwm4e0

pb6T1pqeHPww1wb5N6IJp0JY3ZFnBF3ib5rpsiL3QiF7sO0Y+NgcgmPWui2G29fA

wKGxcP372ivmLdPkH4pbJqqrKmSWhcIKp7ABxohrkMawt1gF0bsHVIAvP7bPgna7

o4PdxhdxxztrH8OqDV1MxJgiWTMZuYZBSUiVj0/lBflyeW3xZV5OeuA2SOGg0g4J

9Arqwwt0VCvrGn7ti458R98GL9/7qY7y17HKAI/vP/ECzAY6CsS93WQSO5Fjtvjk

Mi+OvU7G6LKD+vxnR532vw0XLyW+zCG9vYs8smVE/8eyiemnjB8PUJKUDu7grcsA

fCu41NqtvBeaZdyo8mRICsgQJwuUhPwlqhTL7e9DnO3uzSLZyrUxxjiljsE3m4Ic

+UohyIx5yRkpb6qhSgonPjFc6GsRwXSUVA1kyKxjhw5uiRQMm15BO3IJBR348GTv

uuMlQ2f/1S9vKjzC49YbOLaaexKN7KFMd4oXrUfTcy1zeD5Sb4wZM09r2Ixmzd+r

qi0hTHBzKSHgsaWlZgcTq9k90u/V7hV/0MIVUXh76NG0pXI/JJSvdb35IvWptXuV

PzD0vq5Zr9IthbYiX2GH5DdG6X+IHUnTjF6kZS14wc3Lfdn9oHefWlVSYPRuH8pI

oIaLvkPR7yejSl7TGMvtL4UFuX9HphoIGza30mgrGkjkkUk0nXBG2q4fXTGvr4yM

Rrpqu9G519P15YSVX3H2zj4suVd1DW5arppGFbCuI5T9jvobMHXmoghP3kN8OwBz

SAOalwo4wj31JViN2iueABGvqyhCQ2DHgaMGX+bixFgGMe1+48lp74DlBjtytBEC

jhOey9OeE5jzM2VS2U0WDVO46dZnOtxv1aC6mdl904Tit45qiyFTXRChrrLaQys3

Jly4csOtZVmROrELOOlzTZCNFloAcBHbpoCB3UuQ3+ydzsm4rhwAC1YiEMOHicug

0svgfmjBKaeygDSfT8AcP1tvYNZjWW4dO7JluY5aGLNEPWV13xbxJcvrsOFfb77j

TIm0l5ym9RE4CL1VWAv1InIIAyUuC6XLfOF12tUhy8pp2FEoCe6tayfeQuadFJ0l

PR5WqgR4UyACFJ/Lsi4H972ZVaQbgSLedEYrLAzpEZBjcS8SO+96HFvIHTedWq2E

eaXAyO+oImU=

[root@localhost ~]#



[root@localhost ~]# openssl enc -des3  -d -salt -a -in inittab.des3 -out inittab   (-d 解密)

enter des-ede3-cbc decryption password:

[root@localhost ~]#

[root@localhost ~]# cat inittab

image.png


gpg 也可以加密解密?,后面讲rpm签名的时候,再说gpg



提取指纹

[root@localhost ~]# md5sum inittab        (计算文件的校验码) (128长度)

92a39a223f68e67e9e6c412443851aeb  inittab

[root@localhost ~]#


补全下命令看看

[root@localhost ~]# sha

sha1hmac    sha224sum   sha256sum   sha384sum   sha512sum

sha1sum     sha256hmac  sha384hmac  sha512hmac


[root@localhost ~]# sha1sum inittab            (160长度)

78ef239097844c223671e99a79d6b533dced8d3b  inittab

[root@localhost ~]#

openssl 也可以提取特征码(计算特征码的)

只要算法一样,不管哪种工具,计算出来的结果就是一样的



[root@localhost ~]# openssl dgst -sha1 inittab        (dgst这个子命令表示单向加密算法)

SHA1(inittab)= 78ef239097844c223671e99a79d6b533dced8d3b

[root@localhost ~]#


[root@localhost ~]#

[root@localhost ~]# openssl dgst -md5 inittab (把md5当作选项) (这里inittab是文件 不是字符串)

MD5(inittab)= 92a39a223f68e67e9e6c412443851aeb



[root@localhost ~]# openssl md5 inittab        (把md5当作子命令也可以) (这里inittab是文件 不是字符串)

MD5(inittab)= 92a39a223f68e67e9e6c412443851aeb


[root@localhost ~]# echo -n inittab | openssl md5    (这里  inittab 才是字符串 记住 echo 后面要加-n 表示没有换行的字符串,否则的话就是有换行字符 进行取md5的指纹码了)

a4c77e3d117f7ce7a992606591c9e414

[root@localhost ~]#


# openssl md5 -out test.txt.md5 test.txt         将对test.txt的加密结果重定向到test.txt.md5文件中 


[root@localhost ~]# vim inittab 

对 inittab 一点点改变,最后一行,加个空白行#

image.png

此时 校验码产生了巨大的改变 (雪崩效应)

[root@localhost ~]# openssl dgst -md5 inittab

MD5(inittab)= be8ab42fb3be8e7f6913183f18997314

[root@localhost ~]#


一般不会使用 进行非对称加密来加密数据的

openssl 的 passwd 是模拟与 passwd 一样的工具,能够帮我们去生成用户的密码串的

[root@localhost ~]# man sslpasswd

image.png


-1 表示使用 md5 算法 进行加密

# openssl passwd -1    (也可以 openssl passwd -1  PASSWORD )(即后面直接跟密码) (盐默认是随机的)

# openssl passwd -1  

# openssl passwd -1 -salt tPsgh0st


image.png

image.png

它这个密码 $1 (可以理解为 1 ) 表示 md5加密, oG.....Z/Z/ 是表示的是 md5  密码后的值

$YyZQbcYV (可以理解为 YyZQbcYV  )就是加的盐 杂质  

密码相同,Salt不同,结果不相同

密码相同,Salt相同,结果才相同

salt的目的就是为了防止反推密码的,在加密的时候,加杂质(盐)进去,这些杂质并不影响我们最后的取得结果,(因为我们每次计算都给它加入杂质),但是逆推就很难实现了




openssl 支持 rsa,dsa

[root@localhost ~]# openssl ?

openssl:Error: '?' is an invalid command.


Standard commands

asn1parse      ca             ciphers        crl            crl2pkcs7

dgst           dh             dhparam        dsa            dsaparam

enc            engine         errstr         gendh          gendsa

genrsa         nseq           ocsp           passwd         pkcs12

pkcs7          pkcs8          prime          rand           req

rsa            rsautl         s_client       s_server       s_time

sess_id        smime          speed          spkac          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         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           rc2            rc2-40-cbc

rc2-64-cbc     rc2-cbc        rc2-cfb        rc2-ecb        rc2-ofb

rc4            rc4-40


[root@localhost ~]#


rsa 既支持加密,又支持签名,认证 (使用的比较多)  密钥处理工具,不是加密工具          加密工具是 rsautl  ( rsa  utility ) ( utility 功效,功用 )

dsa 只支持签名,认证(使用的没有rsa多) 密钥处理工具,(况且它根本只能签名,不能加密)

[root@localhost ~]# man rsa        密钥处理工具,不是加密工具

image.png

rsautl        我们一般用它用得不多,知道它就是加密的就行

[root@localhost ~]# man rsautl        才是真正的加密解密工具

image.png


[root@localhost ~]# man dsa    密钥处理工具,不是加密工具,况且它不能加密解密

image.png



[root@localhost ~]# whatis rand

rand                 (3p)  - pseudo-random number generator

rand                 (3)  - pseudo-random number generator

rand [sslrand]       (1ssl)  - generate pseudo-random bytes

rand [sslrand]       (3ssl)  - pseudo-random number generator

[root@localhost ~]# man sslrand        生成伪随机数的,伪随机数生成工具

( pseudo 伪 )

image.png


[root@localhost ~]# openssl rand -base64 45   (-base64加密方式,不加密的话,因为是随机字节,所以可能有乱码)(45是随便一个数字,是base64加密以后的长度,但是我看了为什么长度不是45? 45个字节? 这个45应该是 base64编码之前的随机字节的字节个数吧)

/7g1GyUZp5KNLSkMvcz3EDcWp9C9/DskMAq1tYLMAEkAn5yCaGt/LlBDGb5X

[root@localhost ~]#

[root@localhost ~]# openssl rand -base64 100   (我看了为什么长度不是100?)(事实上最长支持的长度是有限的)

UNKlbAhsLJvJihJwqMkhgDZp2rwy9oZl+N9qQrXk8PxAWaOGG6lT47x2gAuLef7Z

s85t3tJHB3BS1jGAKWKaASkel07YiuhVN+9cWmyqFLxJKEIPgKk+1/8uD+lhgM/o

AXD/JA==

[root@localhost ~]#

[root@localhost ~]# openssl rand -base64 4  (我看了为什么长度不是4?)

tz6hOA==

[root@localhost ~]#


想获得一段随机数当作密码来用 就可以通过  openssl rand 命令来实现



我们一般用 rsa 生成一对密钥 就是 openssl genrsa


[root@localhost ~]# man genrsa            (genrsa: generate rsa)

(生成私钥,(公钥是从私钥中提取的))

所以有了私钥,就有了公钥
numbit 密钥长度 (可选的,默认512位)
-des (或 -des3) 用对称密码的方法加密私钥,(自己每次访问私钥的时候都要使用密码了,这个不常用)

image.png


私钥是非常注重安全性的,所以这个文件至少是 600 权限

两种方法

    1),生成的时候就有 600 权限

    2),生成后改成 600 权限



[root@localhost ~]# openssl genrsa

Generating RSA private key, 512 bit long modulus

...++++++++++++

............................++++++++++++

e is 65537 (0x10001)

-----BEGIN RSA PRIVATE KEY-----

MIIBPAIBAAJBAMCee34nbAJPogbjPeaVjTEXSyftOhHFxCRW8YA/X5khV2L+q9+/

CvbNPkdVpbtYFFZA3lCLLr1FzeIZ3V/wnE8CAwEAAQJAF2Il88atYgpwzQ1BMoDt

Rwxg31P5PLcZfJ/haYRIArrHg2CuqN6Pw4iVA+wu/7dtiFQ4dFD/dXGB6o7FF69a

YQIhAOVhqpDNw9uiHPcG43dkqwsZxhIJLNXiazp8veSXwJgrAiEA1viy5d0r8d6m

/mMHpUSUJ79yqgZz+i0RKyP0HaRkdm0CIQDeP5ovAV+Sz+k2pBMDXKOpdsiGMyOg

/OeeXLz03uA5zwIhAKAiRIlsVtbmh7kJpeFbk42EVHMJOY2L0rUzJB6MnfWFAiEA

zYsqzm+B+8taSxT3Y+gUmOt0lfS7zbshsM1cQ/jaQHU=

-----END RSA PRIVATE KEY-----

[root@localhost ~]#



[root@localhost ~]# openssl genrsa 2048        (生成2048长度的密钥)

Generating RSA private key, 2048 bit long modulus

................................................................................                                      ......................................+++

................................................................................                                      .......................................................+++

e is 65537 (0x10001)

-----BEGIN RSA PRIVATE KEY-----

MIIEpgIBAAKCAQEAwZmA2wBOqCmT9H+xz1NABMu6gaPLdJt0l1lrLu5r0hUzC5Q5

LHUXVvNZSJkWE2x3FIPyG/F21zAzpi/Tsd4UWnBEr8qbttRjsL7P8nGnj3bNcjpG

ms4jajdS4E9wYuZuA0jzD7N+KQGkt+EkMo1Wc7sqaEVYAAO+2zn9Aw3lEVx1SOJD

ml7G3+wVSWSzGr/WcCnYn67eY8251NhHAj2lgzGAAkXZ4DU35DIOWyL+A0YlauCO

AUasPanioCBqRCMC8IyzMT1HGZ2j66JbYQohXsk9yPr0ft6wwuQnne3WJ731M0bL

/PW8IPIehDQQBcQD3/bsI44jjFkzIspHuhMcwwIDAQABAoIBAQCOaKwwbHlvmaYM

JCJXr5VX8cSvuBzhGbkZ29zMGPWXA6EY0197JGaWv0rd7D4g65hsruJZS7VvdTWI

+YVvQT0XiZ388by5MGJkkPfGD3SCQ5G8hMGK/jdu2mNMPSMenQIvyGmDEzWqVFsm

J6bIyM7fMr5vFRM2b4rlGDLVHFN0AJdzk2Yihtbc9njRrXJFBtcxoNjG8g9+MaIh

YRhHAtIQnH6brticNVAaMv3E1gSFYECXRHd5QLaLj4bxKW8Jxbl4mJqtOegGYG5W

kNdv3FLVjrLx9le7N2dBQ8DdMjdbqLT0x1Y9TGDpH9dgQT0LOLxYJCM1/5nOMPmS

x41lN8IBAoGBAOJ0IcZZ0bHX4ifciZCSZWqprp/V1VhQjOzLH/XmSw/91sk7CEn4

pgamkfAaEkqUP8FCUQwaXXqJ15kpelTothVZ3HlI9buMs300kJcF7ICOSnZB626m

o00x0ylWLrHYHlV+AHobEse3uA4u6NwDAmAkSyS/BvyEwlmF985/UTDTAoGBANrc

AFTcu62bzq0QNfER3QhSNNC/76pani0IV+pCH3uA2916nYzJfiJKGVI2FaoG6tSy

hGI429sOyW/y82aRGSKdpP5Q2OSB6MRJzv65JvXFBEyqGheNNlzkstcw9apP9oo5

q4owjOUAzPdEmEfpUjXIlUms5z/EJ5blHxx2+G5RAoGBAIVnhL4lC7OJSmHROflB

RR2g+I6Qmi58xYh54UorcOzqzS2e6TMqmCQy3KZltYDZ9PUU7EoE/izCJ5DDLp32

uc26MngA00K5kMOhw8w0YS8apCMmkluNL4a6Y3tmmfuLJdOXdxB4AohFYth4KhXy

b+PTfbEYGDWKwDOdCG9N8bahAoGBAMMutwD3xkzDCmPfdCvlIXl9TuroccY8gJpq

uXUKuWb8eZig9IcNX3cXHFPsNg/nkWBVQKkUSkanflBfnGDZgFAVxYKk+Xl4vezo

YjlbSHqg1P/GJ/TfFB9uOmydlknofFezrN9WAyFsQF85BpIDbDTZCQKmt6lvt1rk

RYWuOEqxAoGBAJuwZXm9tuUZX8csIsw6RTezz5vBotid4m2b2JwEqQ5lYGUoMRru

iUAZBFcjAUxGt+ujGHS+8/nnQHlVrPvc/CJ50qv783mD0k3Ub4bDUpM5tw4jB92Q

gCU1AoZ1rGB5XnvvELXcPhqPjfZOTtzQWsSg28x4AYhkKgBDar0yGtak

-----END RSA PRIVATE KEY-----

[root@localhost ~]#


[root@localhost ~]# openssl genrsa 2048 > server.key    (重定向保存到文件里面去)

Generating RSA private key, 2048 bit long modulus

...............................................................................................................................+++

..........................................................................................+++

e is 65537 (0x10001)

[root@localhost ~]#

[root@localhost ~]# cat server.key

-----BEGIN RSA PRIVATE KEY-----

MIIEpAIBAAKCAQEAryDZaJOIKgpgfVR0ikVvdFui4bGQmqvcjO6gYEV/a4G5bOiP

imC+x+oJ2YGH4CCH/mVgwQ8TgvDb8R0zR7eqvsOOU/XYSW7qATIEioovsaxSw7+k

CknMk/eABcFkHpfYGs2Zp8oO9zXsEBAhRJuROooRYmxrHjXHjF98CaZsEYmVZf7q

tZ/N00BCI5ouemNyAnCDiidcV1ewZmQMdqRKT4M4f8MpxGWyY5Y4g3lgzF6nurVf

sZh4DOHYOVgl4xXoKysWnzhn3COpGmTSzkINQRKzddFr3EtGrotW1A31wLEuwdEd

zVCEufKARK4Sh9o5K8PL6zmIbosREX2JQB/3LwIDAQABAoIBAH2+SFweEhadfMqA

aW0ejfguE7WZmQp1e9Z1QBHf1K2MZ2cbVHU3IcTI9mmF59m1ge/XOrFj8c6CwmlN

XhSQe7idEQSX8MRJLxvMnhYbQkOAR6zlXRNGCe30N6fqQ8jznecg2MLxAe3eebDO

5BQu3wf5OqJA1mjKlIzlwlnrdIzh3ABgAXU9gRNtGWVeYp1EdqX+QKIgx+7fsbm4

JAlibM2tc2eqo/MN52bz6ia11SypEuCp1/CW/+Z6BRRWr3HHNhEzdev4WbIMCGCs

nVzYgJ42qY7v6gl9fzRa8W/j+NYk9DanRjguaYqibDlohzC9i3bLpkkRBuZJkUm4

DD23hAECgYEA4eQD392PfUV0pSFgxqFxcSp2zs3Mz86FRmvVx3kOeBcR2MJvmU66

dpPtdbv5Q/P99/R0YG/QmjcZAnAJbfCtABop1id+6mcdMqZRfliHOGHbe7mBnh1L

umsOA1Krpl0eAtbWIoFxp7o8c2aysEhsS92yAge0jAKHdsDkzesMnGECgYEAxniw

QrLQY5yaXO4TD/SWUsiKr/I6HQgKYXvwNSPZmIJJ2XzscIbOhGFl/bz30n67CsVQ

ccBv8r1bnhYau2H3LsnWTL6AcdLULk+TjuceKfczWG8jXJ+IrxJXQYPhAB9uNUFw

251oH8zmD9luBOKGwWkaEuTfVtJ2uO/WrPBBvY8CgYEAmI3JIBMdqNiTYkIcfYji

eC7Zdej+/QjYcSq6gbB72Rabcuw9Oig1PYfBwtVkDkRlrGNnhQl+s+ep+D953sm/

zGXfA0ZBLETfLymrt8xJ5gYQmIo7w3C9h/RszkmyqvQQJJK6oysQetoHoVgmLW97

0/CxGzXg9P1wRv8WhwrKxYECgYB1QAV5UeQ0hObYsblHOsq320u7iBF25zIixzJw

Yl6Bb68rMlcIX0uP/25eiY2qqD3drhXJLdO1BtMiQJLIUqbR2GGm8wA0vkWlmlNl

H/q89hI6U2YDqSf5rY8o4D1Dck4MXj3LMGG8L7NWd7A8aIsNpgbGVLnws+N5fA9K

GaHs1wKBgQDOmJWSIurrm/ZijqdFDgojSFjHS5Uj+4Q0I0BeuKF9Li08We+pYkYR

V5o3AwUeQ6724lWkK8Pl4dYeyMEeZC22cKapERFo4iu+XXUrhYLjX0kvamKRUplS

PHNACaPFqEjyH2zGj9MEYFEcCFQRmbKYL7XtBgvqwiINDNB1fd4NcA==

-----END RSA PRIVATE KEY-----

[root@localhost ~]#


[root@localhost ~]# man gendsa

-out filename 直接保存到文件里面,不用输出重定向

-des (或 -des3) 用对称密码的方法加密私钥,(自己每次访问私钥的时候都要使用密码了,这个不常)

image.png

私钥文件是要加密存放的 (这样别人就算获得了私钥,也没法获得里面的数据)

因此我们使用 -des (或 -des3) 指定加密算法,

而后直接回车,它会提示你输密码的,这样子私钥就加密存放了,以后自己访问都需要输密码的,

所以不怎么常用,所以就不管它了,一般很少加密私钥的



用小括号 () 括起来的命令,只在子shell中执行,不在当前shell中执行,

而且执行完之后,子shell就退出了,子shell中的所有的设定就跟我们没有关系了

umask 077 创建的文件都是600,目录都是700


( -out server1024.key 1024 这个顺序不能乱,可以#man genrsa看下)

[root@localhost ~]# ( umask 077; openssl genrsa -out server1024.key 1024)

Generating RSA private key, 1024 bit long modulus

........................++++++

...............++++++

e is 65537 (0x10001)

[root@localhost ~]#

root@localhost ~]# ll

image.png



[root@localhost ~]# umask        (当前umask不变,因为我们是在子shell中执行的,即在小括号里执行的)

0022

[root@localhost ~]#

如果要加密的话 在生成的时候加密 (# man genrsa 执行下看看 有选项 -des (-des3)),也可以在生成后 通过 openssl enc -des (或 -des3 等加密算法) 加密


 openssl rsa -in server.key -pubout

( openssl rsa 从哪里读入密钥, -pubout   (public out )就可以输出公钥)

image.png


公钥是 按照某种机制从私钥里面提取出来的

[root@localhost ~]# openssl rsa -in server1024.key -pubout

writing RSA key

-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnzRHVWdHvE0KrzFF5N5sfBvll

r0ua0GGxKOCbznXYJ35clE0RayaLNkkR3xr1ytBQE+hWo0su/YDAi9YBT6ptu6kd

IFfHL3KGbKnoTk+i0rLE5kI1YEHWpjBwrneesTP7aQSmvl5Pmt1r/LisTQwUhp8w

7dsRJ9qil5Rr4XzzlQIDAQAB

-----END PUBLIC KEY-----

[root@localhost ~]#

[root@localhost ~]# cat server1024.key

-----BEGIN RSA PRIVATE KEY-----

MIICXQIBAAKBgQCnzRHVWdHvE0KrzFF5N5sfBvllr0ua0GGxKOCbznXYJ35clE0R

ayaLNkkR3xr1ytBQE+hWo0su/YDAi9YBT6ptu6kdIFfHL3KGbKnoTk+i0rLE5kI1

YEHWpjBwrneesTP7aQSmvl5Pmt1r/LisTQwUhp8w7dsRJ9qil5Rr4XzzlQIDAQAB

AoGATgNMSDmjHZiBxaePNWEB0HIInxrZdpds49WSXz2kkiMCX35fOjrrx4sse4+T

VDS/los62JTAjo8zPdGFZESqgerJXVusyh6bxzbliO06uQMyXEejxFSeCEGgQSpN

fS1O2Y/hnIoPkZKLLqcOuqNToxUYGctoYSJ8MmEYy3THqN0CQQDcXqnFJOruKUx1

CRiJW3p+HOiLRo0XtdeX0JDz7N+ztJ1H01nt9mglpA/7QhJwBjrK6T4/xPLx1sQs

i0/13Ho/AkEAwu6IHgF70FBYKrBqYnXSw+q7zDdWPkKBVxS6dhGYBgZ7JwFa1NMM

nnI9Oixn2rObxVilF4NUsMpd5h+HgMLVKwJBAIfxic+JV7g2F+l3BADwQt97m+UX

T8DZt7b6vgEMFnA4snH1qtuGj3bw/77jYpZi8W/tdS5HpAuWjoxgIKKuMWcCQQCe

QHJHEeNHkgKR3ZjwiEDshuOhfgdJEkrYvF5IPi5SLe7LEsF/6DrlY08rrCNAHPJI

O5gDx734rMGgclZahVHzAkBc6AD7pTL/x9wtnTJ8OOj2OnGx3h9+jxwQpfSy/en3

bsjQh0FP5N/3cWJqcEakMQFuScLEfU4sj7TobSRPpKAv

-----END RSA PRIVATE KEY-----

[root@localhost ~]#



[root@localhost ~]# man req        (req request)

这是一个生成证书的工具,而且也是一个证书申请生成的工具

image.png

-x509 表示生成一个自签证书

image.png


-new 表示生成一个新的申请

-x509 表示生成一个自签证书

-key 指定密钥文件是什么

-out 证书要保存到什么地方

-days 证书的有效期限


证书的主机名名称 ( hostname ) 一定要与真正的服务器的主机名称保持一致,否则客户端连这个服务器的时候,

它会提示这个证书不可信

互联网上的主机都有DNS名称,写上DNS名称就可以了

image.png




[root@localhost ~]# openssl req -new -x509 -key server1024.key -out server.crt -days 365

image.png


[root@localhost ~]# ll


server.crt     就是一个自签署的证书

image.png


[root@localhost ~]# cat server.crt

-----BEGIN CERTIFICATE-----

MIID7DCCA1WgAwIBAgIJANMSIhdSjFa4MA0GCSqGSIb3DQEBBQUAMIGrMQswCQYD

VQQGEwJDTjEPMA0GA1UECBMGSmlhbnN1MQ8wDQYDVQQHEwZTdXpob3UxIzAhBgNV

BAoTGnd1IHpob25nIGZ1IHpodWFuIHh1ZSB4aWFvMRQwEgYDVQQLEwtXYW5nIHJ1

byBidTEeMBwGA1UEAxMVbG9jYWxob3N0LmxvY2FsZG9tYWluMR8wHQYJKoZIhvcN

AQkBFhA5NTgxODY5NTdAcXEuY29tMB4XDTE5MDEwNDExNTkwOFoXDTIwMDEwNDEx

NTkwOFowgasxCzAJBgNVBAYTAkNOMQ8wDQYDVQQIEwZKaWFuc3UxDzANBgNVBAcT

BlN1emhvdTEjMCEGA1UEChMad3UgemhvbmcgZnUgemh1YW4geHVlIHhpYW8xFDAS

BgNVBAsTC1dhbmcgcnVvIGJ1MR4wHAYDVQQDExVsb2NhbGhvc3QubG9jYWxkb21h

aW4xHzAdBgkqhkiG9w0BCQEWEDk1ODE4Njk1N0BxcS5jb20wgZ8wDQYJKoZIhvcN

AQEBBQADgY0AMIGJAoGBAKfNEdVZ0e8TQqvMUXk3mx8G+WWvS5rQYbEo4JvOddgn

flyUTRFrJos2SRHfGvXK0FAT6FajSy79gMCL1gFPqm27qR0gV8cvcoZsqehOT6LS

ssTmQjVgQdamMHCud56xM/tpBKa+Xk+a3Wv8uKxNDBSGnzDt2xEn2qKXlGvhfPOV

AgMBAAGjggEUMIIBEDAdBgNVHQ4EFgQUQnvx/ofrjoD1TJM3qThMUwFECzcwgeAG

A1UdIwSB2DCB1YAUQnvx/ofrjoD1TJM3qThMUwFECzehgbGkga4wgasxCzAJBgNV

BAYTAkNOMQ8wDQYDVQQIEwZKaWFuc3UxDzANBgNVBAcTBlN1emhvdTEjMCEGA1UE

ChMad3UgemhvbmcgZnUgemh1YW4geHVlIHhpYW8xFDASBgNVBAsTC1dhbmcgcnVv

IGJ1MR4wHAYDVQQDExVsb2NhbGhvc3QubG9jYWxkb21haW4xHzAdBgkqhkiG9w0B

CQEWEDk1ODE4Njk1N0BxcS5jb22CCQDTEiIXUoxWuDAMBgNVHRMEBTADAQH/MA0G

CSqGSIb3DQEBBQUAA4GBAF+ybYm0EGm+dPG5sZnQXHEVZEz1rNSWqbEmaLc/sjdq

pwYFOyqsJhs2mxqSTqZq1/Jg0B5xFzAf76PxYMeAmYxSNdUFn2mpyuGKhRp5Fbk2

N5SMHFT9VN8fJHG0b99aXrty+O0rhFJu5GevUuzMROfhxPFSLXanifvt0odRDBO3

-----END CERTIFICATE-----

[root@localhost ~]#



openssl x509 -text -in server.crt 看看证书内容

-text 表示输出成文本的信息,不加这个选项的话,会生成一堆数据信息,可能是数据编码( hash 编码 )

-in server.crt 表示哪个证书文件 


image.png


  ( issuer 发行者, issue 发行,发布 )

( Algorithm 算法) ( Encryption 加密术 )

Public Key Algorithm: rsaEncryption  (public key 算法 使用 rsa 加密了)

(RSA Public Key 公钥)

Signature Algorithm: sha1WithRSAEncryption  签名信息

( Signature 签名 )


X509v3 Authority Key Identifier   证书颁发机构相关的信息

(Identifier 识别 标识符 编号)


Subject: C=CN, ST=Jiansu, L=Suzhou, O=wu zhong fu zhuan xue xiao, OU=Wang ruo bu, CN=localhost.localdomain/emailAddress=958186957@qq.com         证书持有者的相关信息

Subject Public Key Info  证书持有者的相关信息


Validity  有效期

( Validity 有效性,合法性)


[root@localhost ~]# openssl x509 -text -in server.crt

Certificate:

    Data:

        Version: 3 (0x2)

        Serial Number:

            d3:12:22:17:52:8c:56:b8

        Signature Algorithm: sha1WithRSAEncryption

        Issuer: C=CN, ST=Jiansu, L=Suzhou, O=wu zhong fu zhuan xue xiao, OU=Wang ruo bu, CN=localhost.localdomain/emailAddress=958186957@qq.com 

        Validity

            Not Before: Jan  4 11:59:08 2019 GMT

            Not After : Jan  4 11:59:08 2020 GMT

        Subject: C=CN, ST=Jiansu, L=Suzhou, O=wu zhong fu zhuan xue xiao, OU=Wang ruo bu, CN=localhost.localdomain/emailAddress=958186957@qq.com

        Subject Public Key Info:

            Public Key Algorithm: rsaEncryption

            RSA Public Key: (1024 bit)

                Modulus (1024 bit):

                    00:a7:cd:11:d5:59:d1:ef:13:42:ab:cc:51:79:37:

                    9b:1f:06:f9:65:af:4b:9a:d0:61:b1:28:e0:9b:ce:

                    75:d8:27:7e:5c:94:4d:11:6b:26:8b:36:49:11:df:

                    1a:f5:ca:d0:50:13:e8:56:a3:4b:2e:fd:80:c0:8b:

                    d6:01:4f:aa:6d:bb:a9:1d:20:57:c7:2f:72:86:6c:

                    a9:e8:4e:4f:a2:d2:b2:c4:e6:42:35:60:41:d6:a6:

                    30:70:ae:77:9e:b1:33:fb:69:04:a6:be:5e:4f:9a:

                    dd:6b:fc:b8:ac:4d:0c:14:86:9f:30:ed:db:11:27:

                    da:a2:97:94:6b:e1:7c:f3:95

                Exponent: 65537 (0x10001)

        X509v3 extensions:

            X509v3 Subject Key Identifier:

                42:7B:F1:FE:87:EB:8E:80:F5:4C:93:37:A9:38:4C:53:01:44:0B:37

            X509v3 Authority Key Identifier:

                keyid:42:7B:F1:FE:87:EB:8E:80:F5:4C:93:37:A9:38:4C:53:01:44:0B:37

                DirName:/C=CN/ST=Jiansu/L=Suzhou/O=wu zhong fu zhuan xue xiao/OU=Wang ruo bu/CN=localhost.localdomain/emailAddress=958186957@qq.com

                serial:D3:12:22:17:52:8C:56:B8


            X509v3 Basic Constraints:

                CA:TRUE

    Signature Algorithm: sha1WithRSAEncryption

        5f:b2:6d:89:b4:10:69:be:74:f1:b9:b1:99:d0:5c:71:15:64:

        4c:f5:ac:d4:96:a9:b1:26:68:b7:3f:b2:37:6a:a7:06:05:3b:

        2a:ac:26:1b:36:9b:1a:92:4e:a6:6a:d7:f2:60:d0:1e:71:17:

        30:1f:ef:a3:f1:60:c7:80:99:8c:52:35:d5:05:9f:69:a9:ca:

        e1:8a:85:1a:79:15:b9:36:37:94:8c:1c:54:fd:54:df:1f:24:

        71:b4:6f:df:5a:5e:bb:72:f8:ed:2b:84:52:6e:e4:67:af:52:

        ec:cc:44:e7:e1:c4:f1:52:2d:76:a7:89:fb:ed:d2:87:51:0c:

        13:b7

-----BEGIN CERTIFICATE-----

MIID7DCCA1WgAwIBAgIJANMSIhdSjFa4MA0GCSqGSIb3DQEBBQUAMIGrMQswCQYD

VQQGEwJDTjEPMA0GA1UECBMGSmlhbnN1MQ8wDQYDVQQHEwZTdXpob3UxIzAhBgNV

BAoTGnd1IHpob25nIGZ1IHpodWFuIHh1ZSB4aWFvMRQwEgYDVQQLEwtXYW5nIHJ1

byBidTEeMBwGA1UEAxMVbG9jYWxob3N0LmxvY2FsZG9tYWluMR8wHQYJKoZIhvcN

AQkBFhA5NTgxODY5NTdAcXEuY29tMB4XDTE5MDEwNDExNTkwOFoXDTIwMDEwNDEx

NTkwOFowgasxCzAJBgNVBAYTAkNOMQ8wDQYDVQQIEwZKaWFuc3UxDzANBgNVBAcT

BlN1emhvdTEjMCEGA1UEChMad3UgemhvbmcgZnUgemh1YW4geHVlIHhpYW8xFDAS

BgNVBAsTC1dhbmcgcnVvIGJ1MR4wHAYDVQQDExVsb2NhbGhvc3QubG9jYWxkb21h

aW4xHzAdBgkqhkiG9w0BCQEWEDk1ODE4Njk1N0BxcS5jb20wgZ8wDQYJKoZIhvcN

AQEBBQADgY0AMIGJAoGBAKfNEdVZ0e8TQqvMUXk3mx8G+WWvS5rQYbEo4JvOddgn

flyUTRFrJos2SRHfGvXK0FAT6FajSy79gMCL1gFPqm27qR0gV8cvcoZsqehOT6LS

ssTmQjVgQdamMHCud56xM/tpBKa+Xk+a3Wv8uKxNDBSGnzDt2xEn2qKXlGvhfPOV

AgMBAAGjggEUMIIBEDAdBgNVHQ4EFgQUQnvx/ofrjoD1TJM3qThMUwFECzcwgeAG

A1UdIwSB2DCB1YAUQnvx/ofrjoD1TJM3qThMUwFECzehgbGkga4wgasxCzAJBgNV

BAYTAkNOMQ8wDQYDVQQIEwZKaWFuc3UxDzANBgNVBAcTBlN1emhvdTEjMCEGA1UE

ChMad3UgemhvbmcgZnUgemh1YW4geHVlIHhpYW8xFDASBgNVBAsTC1dhbmcgcnVv

IGJ1MR4wHAYDVQQDExVsb2NhbGhvc3QubG9jYWxkb21haW4xHzAdBgkqhkiG9w0B

CQEWEDk1ODE4Njk1N0BxcS5jb22CCQDTEiIXUoxWuDAMBgNVHRMEBTADAQH/MA0G

CSqGSIb3DQEBBQUAA4GBAF+ybYm0EGm+dPG5sZnQXHEVZEz1rNSWqbEmaLc/sjdq

pwYFOyqsJhs2mxqSTqZq1/Jg0B5xFzAf76PxYMeAmYxSNdUFn2mpyuGKhRp5Fbk2

N5SMHFT9VN8fJHG0b99aXrty+O0rhFJu5GevUuzMROfhxPFSLXanifvt0odRDBO3

-----END CERTIFICATE-----

[root@localhost ~]#


CA证书准备好了,可以给别人发证了


客户端,它想使用证书,要向CA申请证书,只需要自己生成一个申请,把申请交给CA,CA帮你签署一下就行了


现在CA没法用,要想让CA真正工作起来,还需要做一些额外的配置

证书和密钥是不能随便放的,因为它工作成CA的时候,有个配置文件 ( /etc/pki/tls/openssl.cnf )

[root@localhost ~]# vim /etc/pki/tls/openssl.cnf

#

# OpenSSL example configuration file.

# This is mostly being used for generation of certificate requests.

#


# This definition stops the following lines choking if HOME isn't

# defined.

HOME                    = .

RANDFILE                = $ENV::HOME/.rnd


# Uncomment out to enable OpenSSL configuration see config(3)

# openssl_conf = openssl_init


# To use this configuration file with the "-extfile" option of the

# "openssl x509" utility, name here the section containing the

# X.509v3 extensions to use:

# extensions            =

# (Alternatively, use a configuration file that has only

# X.509v3 extensions in its main [= default] section.)


[openssl_init]

# Extra OBJECT IDENTIFIER info:

oid_section = new_oids

alg_section = algs


[ new_oids ]


# We can add new OIDs in here for use by any config aware application

# Add a simple OID like this:

# shortname=Long Object Identifier Name, 1.2.3.4

# Or use config file substitution like this:

# testoid2=OID2 LONG NAME, ${testoid1}.5.6, OTHER OID


[ algs ]

# Algorithm configuration options. Currently just fips_mode

fips_mode = no


####################################################################

[ ca ]

default_ca      = CA_default            # The default ca section


####################################################################

[ CA_default ]


dir             = /etc/pki/CA  #../../CA                # Where everything is kept

certs           = $dir/certs    # 证书位置,客户端证书位置     # Where the issued certs are kept

crl_dir         = $dir/crl      #证书吊销列表位置       # Where the issued crl are kept

database        = $dir/index.txt  #给哪些人发了证,证都要放在这里,可以检索这些相关证书的 # database index file.

#unique_subject = no                    # Set to 'no' to allow creation of

                                        # several ctificates with same subject.

new_certs_dir   = $dir/newcerts   #刚生成的新证书放的地方               # default place for new certs.


certificate     = $dir/cacert.pem  #CA自己的证书是什么  # The CA certificate

serial          = $dir/serial #  这是当前签署给别人的证书的序列号,一般从01开始  $dir/index.txt,签署给别人的证书            # The current serial number

crlnumber       = $dir/crlnumber #证书撤销列表中各个撤销(应该是当前撤销)的证书对应的号码(工作号,工作到哪个号码了)        # the current crl number

                                        # must be commented out to leave a V1 CRL

crl             = $dir/crl.pem    #当前的证书吊销列表的文件   # The current CRL

private_key     = $dir/private/cakey.pem # CA自己的私钥  # The private key

RANDFILE        = $dir/private/.rand  #随机数文件 不用建立,它自己会生成,不用管它        # private random number file


x509_extensions = usr_cert              # The extentions to add to the cert


# Comment out the following two lines for the "traditional"

# (and highly broken) format.

name_opt        = ca_default            # Subject Name options

cert_opt        = ca_default            # Certificate field options


# Extension copying option: use with caution.

# copy_extensions = copy


# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs

# so this is commented out by default to leave a V1 CRL.

# crlnumber must also be commented out to leave a V1 CRL.

# crl_extensions        = crl_ext


default_days    = 3657 #大约10年 #365   #默认证书的有效期限 365天               # how long to certify for

default_crl_days= 30 #吊销以后,是应该放到吊销列表里面,在证书吊销列表中放多长时间 在$dir/crl 目录中放多久                       # how long before next CRL

default_md      = sha1 #单向加密算法,默认使用的算法                     # which md to use.

preserve        = no                    # keep passed DN ordering


# A few difference way of specifying how similar the request should look

# For type CA, the listed attributes must be the same, and the optional

# and supplied fields are just that :-)

policy          = policy_match


# For the CA policy

[ policy_match ]

countryName             = match

stateOrProvinceName     = match

organizationName        = match

organizationalUnitName  = optional

commonName              = supplied

emailAddress            = optional


# For the 'anything' policy

# At this point in time, you must list all acceptable 'object'

# types.

[ policy_anything ]

countryName             = optional

stateOrProvinceName     = optional

localityName            = optional

organizationName        = optional

organizationalUnitName  = optional

commonName              = supplied

emailAddress            = optional


####################################################################

[ req ]

default_bits            = 1024

default_md              = sha1

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


# Passwords for private keys if not present they will be prompted for

# input_password = secret

# output_password = secret

# This sets a mask for permitted string types. There are several options.

# default: PrintableString, T61String, BMPString.

# pkix   : PrintableString, BMPString.

# utf8only: only UTF8Strings.

# nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).

# MASK:XXXX a literal mask value.

# WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings

# so use this option with caution!

# we use PrintableString+UTF8String mask so if pure ASCII texts are used

# the resulting certificates are compatible with Netscape

string_mask = MASK:0x2002


# req_extensions = v3_req # The extensions to add to a certificate request


[ req_distinguished_name ]

countryName                     = Country Name (2 letter code)

countryName_default             = CN # GB  #默认国家,这里为GB,改成了CN ,这样在生成证书的时候,省得填了,直接回车就可以了

countryName_min                 = 2

countryName_max                 = 2


stateOrProvinceName             = State or Province Name (full name)

stateOrProvinceName_default     = Jiangsu #Berkshire 默认省份,(美国的州)


localityName                    = Locality Name (eg, city)

localityName_default            = Suzhou  #Newbury 默认城市苏州


0.organizationName              = Organization Name (eg, company)

0.organizationName_default      = Wu zhong fu zhuang xue xiao #My Company Ltd #默认公司名称

# we can do this but it is not needed normally :-)

#1.organizationName             = Second Organization Name (eg, company)

#1.organizationName_default     = World Wide Web Pty Ltd


organizationalUnitName          = Organizational Unit Name (eg, section)

organizationalUnitName_default  = Wang ruo bu # 默认部门

#organizationalUnitName_default =


commonName                      = Common Name (eg, your name or your server\'s hostname) # 这里填主机名,肯定是不能一样

的哦

#commonName_default             =

commonName_max                  = 64


emailAddress                    = Email Address #邮件地址,一般也不能一样,想定设定给它个默认值就可以

#emailAddress_default            =

emailAddress_max                = 64


# SET-ex3                       = SET extension number 3


[ req_attributes ]

challengePassword               = A challenge password

challengePassword_min           = 4

challengePassword_max           = 20


unstructuredName                = An optional company name


[ usr_cert ]


# These extensions are added when 'ca' signs a request.


# This goes against PKIX guidelines but some CAs do it and some software

# requires this to avoid interpreting an end user certificate as a CA.


basicConstraints=CA:FALSE


# Here are some examples of the usage of nsCertType. If it is omitted

# the certificate can be used for anything *except* object signing.


# This is OK for an SSL server.

# nsCertType                    = server


# For an object signing certificate this would be used.

# nsCertType = objsign


# For normal client use this is typical

# nsCertType = client, email


# and for everything including object signing:

# nsCertType = client, email, objsign


# This is typical in keyUsage for a client certificate.

# keyUsage = nonRepudiation, digitalSignature, keyEncipherment


# This will be displayed in Netscape's comment listbox.

nsComment                       = "OpenSSL Generated Certificate"


# PKIX recommendations harmless if included in all certificates.

subjectKeyIdentifier=hash

authorityKeyIdentifier=keyid,issuer


# This stuff is for subjectAltName and issuerAltname.

# Import the email address.

# subjectAltName=email:copy

# An alternative to produce certificates that aren't

# deprecated according to PKIX.

# subjectAltName=email:move


# Copy subject details

# issuerAltName=issuer:copy


#nsCaRevocationUrl              = http://www.domain.dom/ca-crl.pem

#nsBaseUrl

#nsRevocationUrl

#nsRenewalUrl

#nsCaPolicyUrl

#nsSslServerName


[ v3_req ]


# Extensions to add to a certificate request


basicConstraints = CA:FALSE

keyUsage = nonRepudiation, digitalSignature, keyEncipherment


[ v3_ca ]


# Extensions for a typical CA



# PKIX recommendation.


subjectKeyIdentifier=hash


authorityKeyIdentifier=keyid:always,issuer:always


# This is what PKIX recommends but some broken software chokes on critical

# extensions.

#basicConstraints = critical,CA:true

# So we do this instead.

basicConstraints = CA:true


# Key usage: this is typical for a CA certificate. However since it will

# prevent it being used as an test self-signed certificate it is best

# left out by default.

# keyUsage = cRLSign, keyCertSign


# Some might want this also

# nsCertType = sslCA, emailCA


# Include email address in subject alt name: another PKIX recommendation

# subjectAltName=email:copy

# Copy issuer details

# issuerAltName=issuer:copy


# DER hex encoding of an extension: beware experts only!

# obj=DER:02:03

# Where 'obj' is a standard or added object

# You can even override a supported extension:

# basicConstraints= critical, DER:30:03:01:01:FF


[ crl_ext ]


# CRL extensions.

# Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.


# issuerAltName=issuer:copy

authorityKeyIdentifier=keyid:always,issuer:always


[ proxy_cert_ext ]

# These extensions should be added when creating a proxy certificate


# This goes against PKIX guidelines but some CAs do it and some software

# requires this to avoid interpreting an end user certificate as a CA.


basicConstraints=CA:FALSE


# Here are some examples of the usage of nsCertType. If it is omitted

# the certificate can be used for anything *except* object signing.


# This is OK for an SSL server.

# nsCertType                    = server


# For an object signing certificate this would be used.

# nsCertType = objsign


# For normal client use this is typical

# nsCertType = client, email


# and for everything including object signing:

# nsCertType = client, email, objsign


# This is typical in keyUsage for a client certificate.

# keyUsage = nonRepudiation, digitalSignature, keyEncipherment


# This will be displayed in Netscape's comment listbox.

nsComment                       = "OpenSSL Generated Certificate"


# PKIX recommendations harmless if included in all certificates.

subjectKeyIdentifier=hash

authorityKeyIdentifier=keyid,issuer:always


# This stuff is for subjectAltName and issuerAltname.

# Import the email address.

# subjectAltName=email:copy

# An alternative to produce certificates that aren't

# deprecated according to PKIX.

# subjectAltName=email:move


# Copy subject details

# issuerAltName=issuer:copy


#nsCaRevocationUrl              = http://www.domain.dom/ca-crl.pem

#nsBaseUrl

#nsRevocationUrl

#nsRenewalUrl

#nsCaPolicyUrl

#nsSslServerName


# This really needs to be in place for it to be a proxy certificate.

proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo


接下来准备给CA准备私钥和证书了

[root@localhost pki]# pwd

/etc/pki

[root@localhost pki]#


[root@localhost pki]# ls

CA  entitlement  nssdb  product  rpm-gpg  tls

[root@localhost pki]#

[root@localhost pki]# cd CA

[root@localhost CA]# ls

private

[root@localhost CA]# pwd

/etc/pki/CA

[root@localhost CA]#



下面的两步是给CA准备私钥和证书


生成 CA自己的私钥,

[root@localhost CA]# ( umask 077; openssl genrsa -out private/cakey.pem 2048)   (位长 2048  CA证书长度2048,尽可能长点)

Generating RSA private key, 2048 bit long modulus

.............+++

................................................+++

e is 65537 (0x10001)

[root@localhost CA]#

[root@localhost CA]# ls -la private/

总计 20

drwx------ 2 root root 4096 01-04 22:43 .

drwx------ 3 root root 4096 11-10 14:08 ..

-rw------- 1 root root 1679 01-04 22:43 cakey.pem

[root@localhost CA]# 


CA证书,CA自签证书  (-new -x509是固定格式) (-days 不用指了吧)

[root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem

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

Locality Name (eg, city) [Suzhou]:

Organization Name (eg, company) [Wu zhong fu zhuang xue xiao]:

Organizational Unit Name (eg, section) [Wang ruo bu]:

Common Name (eg, your name or your server's hostname) []:localhost.localdomain

Email Address []:958186957@qq.com

[root@localhost CA]#

准备几个目录

[root@localhost CA]# mkdir certs newcerts crl

[root@localhost CA]#

[root@localhost CA]# ls

cacert.pem  certs  crl  newcerts  private

[root@localhost CA]#

还有准备两个文件

[root@localhost CA]# touch index.txt

[root@localhost CA]# touch serial

serial 给它个起始号

[root@localhost CA]# echo 01 > serial

如果没有证书吊销列表的话,证书吊销号码( 见上面 openssl.cnf 文件里 crlnumber       = $dir/crlnumber  )可以不用写

[root@localhost CA]#

到此为止,CA算是准备完整了

接下来,别人就可以申请了,比如再启动一个主机,在另外一个主机上生成一个密钥,自己生成一个证书颁发申请,并发给这个CA服务器,CA服务器帮你一签,证书就生成了


假设我们建立一个 web 服务器,web服务器的配置文件都在/etc/httpd的目录下

为它准备证书和密钥

[root@localhost CA]# cd

[root@localhost ~]# mkdir /etc/httpd

mkdir: 无法创建目录 “/etc/httpd”: 文件已存在

[root@localhost httpd]# ls

conf  conf.d  logs  modules  run

创建 ssl

[root@localhost httpd]# mkdir ssl

到 

[root@localhost httpd]# cd ssl

[root@localhost ssl]# pwd

/etc/httpd/ssl

[root@localhost ssl]#

证书 密钥到底放哪里不确定,根据自己的需要,一般放在配置文件的目录里就可以了,

任何一个应用要想用到证书,它必须有私钥,因为我们要从它的私钥里面提取公钥

(刚才的公钥,私钥是CA的,跟当前的web服务器没关系,千万不要拿着CA的给web服务器用,这是两种不同的应用)

每一种应用都需要自己的证书,

如果还需要发邮件的话,邮件应用证书还需要为邮件服务器生成一对密钥证书

两种服务尽可能不要使用同一种证书,

要有证书,得有私钥和公钥


[root@localhost ssl]# (umask 077;openssl genrsa -out httpd.key)    (没指定位长就是 512 位)

Generating RSA private key, 512 bit long modulus

..++++++++++++

............................++++++++++++

e is 65537 (0x10001)

[root@localhost ssl]#


[root@localhost ssl]# (umask 077;openssl genrsa -out httpd.key 1024)           (重新指定位长 1024 位,默认512位太短了)

Generating RSA private key, 1024 bit long modulus

..++++++

........++++++

e is 65537 (0x10001)

[root@localhost ssl]#

此时生成的 httpd.key 会覆盖掉以前的 httpd.key

[root@localhost ssl]# cat httpd.key        

-----BEGIN RSA PRIVATE KEY-----

MIICXQIBAAKBgQCdYbnBmxu/tZ5tLOBagMAw8uKknMitpypHKeTb+pJGD8dIZFjg

pOSwpBtmPNnF4oy3cZNCP6HLczYx1757n9PM0g/oPfOFKIwVcVk9JuaQY/hLm2ky

ajo0XPFsL9Vevun+lTqbPy5r7X+Y5HO3NibzV0jxX+Ic1WjRyctiZF+ZBwIDAQAB

AoGBAIYCPKW6aXpoL6pO2Aq4Lu5/IrWAOvCCsuE9rv4Q8pRtwwbFS1idj41Jb3sy

vUxeh+t77iQvApm2VKNETZH+md0r9eHLxubwxYNdvsxcV1x/nms2NmfwgeV1bvKc

UAe/lj0uxOM4/dhDgu3bD0EHNBjJJJ8uaygm0QZ9S3nqtBxBAkEAyyL7bhufQ6ld

nDyxGcdUl3SJI4i2hjpn6YBVGAOuUOrtDLqcDDb6XXfq7REy6eFsQjo55vfkggWo

xPdVuTjtTwJBAMZWigt+7NBCGbblx/xxdLA5WyMJpr4ihqtQweXNq5ZIoT7MEQuC

YjKPIe3IYHxl+GyUipMNiChCdGPHvYPo2skCQAmwc3m/C4u4qmRnaLMoFNrcjiYJ

wVsJsicrHeP1WP03F3OB+yuB+9M1gxknttv9CqLmEBj6PgYNqw0qFwastnUCQQCg

V5nmTUg53RZYzE7vAPHq/ZN2MflBQTxKB1GZ7LnJFxJ0aBlnipLEeP5e8109dFpv

vW6CD7CBi6f4eqP1niwxAkB1V9uDFyIrguYIP7VRgEUBWy8iUKimzQT0v5drpACA

nbb7ukzoP/eNIQoq4pCsgbsY9ryV2QDY7h9ImYrgDBkI

-----END RSA PRIVATE KEY-----

[root@localhost ssl]#

我们不可能自己给自己发证的,我们要到CA那里自己去申请证书

(我们试验的时候是在本机上做的,将来应用的时候,(CA和http的证书)应该不在同一台主机上)

现在我们生成一个证书颁发请求(请求CA签署一下,请求CA发一下证),所以 申请里面的所有内容

(包括个人信息,个人地址,什么什么之类的)都要自己填的,填好之后,证书还是不能用,

什么时候才能当证书来用 (办身份证的时候,照片,姓名,年龄都是自己提供的,盖上的那个戳不是自己提供的)

申请都是自己填的,能不能申请通过,对方盖一个戳,就可以了.

盖一个戳,就是加上CA的签名,计算下整个的特征码,并且特征码用CA的私钥加密一下,放在后面,这就叫签署

CA就是做最后的签署,申请所有前述的工作都是由应用自己申请的


此时不用 -x509 ,因为x509是生成自签证书用的,其它都一样

http.csr (特定的后缀名) .csr 证书签署请求certificate singnature request

(不让.csr结尾也没问题,应该做到见名知义)


私有证书当中 机构部门(组织单位) 应该保持一致,换了公司名称,就不给你签了

A challenge password []: 这里不加密了

An optional company name []:可选的公司名称也不填了


[root@localhost ssl]# openssl req -new -key httpd.key -out httpd.csr

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

Locality Name (eg, city) [Suzhou]:

Organization Name (eg, company) [Wu zhong fu zhuang xue xiao]:

Organizational Unit Name (eg, section) [Wang ruo bu]:

Common Name (eg, your name or your server's hostname) []:www.magedu.com

Email Address []:958186957@qq.com


Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

[root@localhost ssl]#

上一个命令是请求生成好了

[root@localhost ssl]# ls

httpd.csr  httpd.key

[root@localhost ssl]#

此时让CA给你的请求签一下名,签署一下,证书就成了有效的证书了,就可以拿回来用了

这个请求要发给CA, 当然现在是在同一台主机上(CA和http服务器在同一台主机上)就无所谓了,就可以直接签了

如果不在同一台主机上,这个请求要发给服务器的(下一节课讲到如何发,远程传过去就行)


怎么签

openssl ca  进行ca模式

-in httpd.csr 读取签署请求

-out httpd.crt 保存为 httpd.crt

-days 365 明确指定为 365 天的期限

[root@localhost ssl]# openssl ca -in httpd.csr -out http.crt -days 365  (-days 365 可以省略)

Using configuration from /etc/pki/tls/openssl.cnf  # 使用这个配置文件

Check that the request matches the signature

Signature ok

Certificate Details:    # Certificate Details 证书细节

        Serial Number: 1 (0x1)

        Validity

            Not Before: Jan  4 17:23:41 2019 GMT

            Not After : Jan  4 17:23:41 2020 GMT

        Subject:    # 主题 ,证书申请的主题的详细信息

            countryName               = CN

            stateOrProvinceName       = Jiangsu

            organizationName          = Wu zhong fu zhuang xue xiao

            organizationalUnitName    = Wang ruo bu

            commonName                = www.magedu.com

            emailAddress              = 958186957@qq.com

        X509v3 extensions:

            X509v3 Basic Constraints:

                CA:FALSE

            Netscape Comment:      # x509的格式化相关信息都在这儿

                OpenSSL Generated Certificate    # x509的格式化相关信息都在这儿

            X509v3 Subject Key Identifier:    # x509的格式化相关信息都在这儿

                3D:53:88:A9:FF:85:AF:BE:B4:D0:FC:CE:86:88:E3:69:86:AD:D2:32    # x509的格式化相关信息都在这儿

            X509v3 Authority Key Identifier:    # x509的格式化相关信息都在这儿

                keyid:A8:86:CB:28:4A:F4:F1:4A:61:E2:C1:9E:D1:37:0A:EE:41:EA:5C:16    # x509的格式化相关信息都在这儿

Certificate is to be certified until Jan  4 17:23:41 2020 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 ssl]#

看到一个证书 http.crt 

[root@localhost ssl]# ll

总计 12

-rw-r--r-- 1 root root 4006 01-05 01:28 http.crt

-rw-r--r-- 1 root root  737 01-05 01:02 httpd.csr

-rw------- 1 root root  887 01-04 23:54 httpd.key

[root@localhost ssl]#

[root@localhost ssl]# cd /etc/pki/CA

[root@localhost CA]# cat index.txt            看到已经签署了一个证书

01是从serial中读出来的     /C=CN/ST=Jiangsu/O=Wu zhong fu zhuang xue xiao/OU=Wang ruo bu/CN=www.magedu.com/emailAddress=958186957@qq.com 这里整个证书的相关信息

这个文件就是数据库信息,如果还有证书就会依次往下排 02  03 04



V       200104172341Z           01      unknown /C=CN/ST=Jiangsu/O=Wu zhong fu zhuang xue xiao/OU=Wang ruo bu/CN=www.magedu.com/emailAddress=958186957@qq.com

[root@localhost CA]# 


[root@localhost CA]# cat serial         (    现在serail变成了02,表示下一个再签一下证书就变成02了 ,  serial 的值就变成了 03 )   

02

[root@localhost CA]#


这是自己给自己同一台主机上的另外一个应用签的

如果有其它主机,在其它主机上生成私钥,生成请求,传递到这个服务器上,一签,再传递给回去,就可以了


这个过程应该背会的,而且这整个过程要求通过脚本来实现 (至少把自己的主机扮演成CA,最起码把当前主机能够做成一个CA的过程用脚本写出来)(包括修改openssl.cnf这个配置文件,用sed命令修改吧,而且要创建对应的目录,给自己生成一个密钥,给自己创建一个自签证书)


以上就是整个证书的私有CA的创建,以及如何让私有CA为某种应用签署证书




 红帽提供了一个体验的工具

[root@localhost CA]# cd /etc/pki/tls

[root@localhost tls]# ls

cert.pem  certs  misc  openssl.cnf  private

[root@localhost tls]#

有个子目录叫 certs (与 openssl.cnf 同目录)


[root@localhost tls]# cd certs/

[root@localhost certs]# pwd

/etc/pki/tls/certs

[root@localhost certs]# ls

ca-bundle.crt  localhost.crt  make-dummy-cert  Makefile

有个Makefile文件

在这个目录里面可以执行make命令,可以生成一个快速用的测试证书

(不能在生产环境中用,最多只能测试使用,但可以快速生成)

刚才使用openssl 创建的过程,一切都是可以在生产环境中用的,

此时为了简单测试的话,可以使用make命令来生成的

make 随便什么证书 make .crt,  make .pem都可以



[root@localhost certs]# make httpd.pem

帮你生成私钥,让你填各种信息

umask 77 ; \

        PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \

        PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \

        /usr/bin/openssl req -utf8 -newkey rsa:2048 -keyout $PEM1 -nodes -x509 -days 365 -out $PEM2 -set_serial 0 ; \

        cat $PEM1 >  httpd.pem ; \

        echo ""    >> httpd.pem ; \

        cat $PEM2 >> httpd.pem ; \

        rm -f $PEM1 $PEM2

Generating a 2048 bit RSA private key

.........................+++

..+++

writing new private key to '/tmp/openssl.ZP7115'

-----

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

Locality Name (eg, city) [Suzhou]:

Organization Name (eg, company) [Wu zhong fu zhuang xue xiao]:

Organizational Unit Name (eg, section) [Wang ruo bu]:

Common Name (eg, your name or your server's hostname) []:www.magedu.com

Email Address []:958186957@qq.com

[root@localhost certs]#


[root@localhost certs]# ls

ca-bundle.crt  httpd.pem  localhost.crt  make-dummy-cert  Makefile

[root@localhost certs]#

把 httpd.pem 复制走,就可以直接用了

httpd.pem  这里面既有证书,又有私钥

(私钥放在证书里面,别人只要拿到证书,就能拿到你的私钥了,所以这只是测试使用的)


这里面也可以生成证书颁发请求,也可以快速帮你生成密钥,都可以的


make 跟文件名(文件名的后缀很重要),它正是通过后缀来判定给你生成什么样的格

式的文件,到底是什么样的格式呢 可以看看 Makefile 文件

[root@localhost certs]# cat Makefile

这里已经定义好了,是个格式文件,是个脚本一样的东西

make 命令是根据 Makefile文件帮你快速生成测试工具的

Makefile 是 make命令用到的配置文件而已

我们不建议这么玩,虽然 make 命令简单,但是没有什么实用性,还不如自己使用命令来完成,只不过某些命令忘了怎么写,可以看看 Makefile 文件 给我们的提示


UTF8 := $(shell locale -c LC_CTYPE -k | grep -q charmap.*UTF-8 && echo -utf8)

SERIAL=0

PRIVATE_KEY_BITS=2048


.PHONY: usage

.SUFFIXES: .key .csr .crt .pem

.PRECIOUS: %.key %.csr %.crt %.pem


usage:

        @echo "This makefile allows you to create:"

        @echo "  o public/private key pairs"

        @echo "  o SSL certificate signing requests (CSRs)"

        @echo "  o self-signed SSL test certificates"

        @echo

        @echo "To create a key pair, run \"make SOMETHING.key\"."

        @echo "To create a CSR, run \"make SOMETHING.csr\"."

        @echo "To create a test certificate, run \"make SOMETHING.crt\"."

        @echo "To create a key and a test certificate in one file, run \"make SO                                      METHING.pem\"."

        @echo

        @echo "To create a key for use with Apache, run \"make genkey\"."

        @echo "To create a CSR for use with Apache, run \"make certreq\"."

        @echo "To create a test certificate for use with Apache, run \"make test                                      cert\"."

        @echo

        @echo "To create a test certificate with serial number other than zero,                                       add SERIAL=num"

        @echo

        @echo Examples:

        @echo "  make server.key"

        @echo "  make server.csr"

        @echo "  make server.crt"

        @echo "  make stunnel.pem"

        @echo "  make genkey"

        @echo "  make certreq"

        @echo "  make testcert"

        @echo "  make server.crt SERIAL=1"

        @echo "  make stunnel.pem SERIAL=2"

        @echo "  make testcert SERIAL=3"


%.pem:        # .pem后缀名 如果是.pem的话,给你生成一个测试证书,既有私钥,又有证书 (自签的证书)

        umask 77 ; \

        PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \

        PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \

        /usr/bin/openssl req $(UTF8) -newkey rsa:$(PRIVATE_KEY_BITS) -keyout $$P                                      EM1 -nodes -x509 -days 365 -out $$PEM2 -set_serial $(SERIAL) ; \

        cat $$PEM1 >  $@ ; \

        echo ""    >> $@ ; \

        cat $$PEM2 >> $@ ; \

        $(RM) $$PEM1 $$PEM2


%.key:        # .key后缀名 如果是.key的话,是帮你生成密钥的

        umask 77 ; \

        /usr/bin/openssl genrsa -des3 $(PRIVATE_KEY_BITS) > $@


%.csr: %.key         #  %.csr: %.key  ,帮你生成证书颁发申请的

        umask 77 ; \

        /usr/bin/openssl req $(UTF8) -new -key $^ -out $@


%.crt: %.key        #  %.csr: %.key  ,帮你生成证书的

        umask 77 ; \

        /usr/bin/openssl req $(UTF8) -new -key $^ -x509 -days 365 -out $@ -set_s                                      erial $(SERIAL)


TLSROOT=/etc/pki/tls

KEY=$(TLSROOT)/private/localhost.key

CSR=$(TLSROOT)/certs/localhost.csr

CRT=$(TLSROOT)/certs/localhost.crt


genkey: $(KEY)

certreq: $(CSR)

testcert: $(CRT)


$(CSR): $(KEY)

        umask 77 ; \

        /usr/bin/openssl req $(UTF8) -new -key $(KEY) -out $(CSR)


$(CRT): $(KEY)

        umask 77 ; \

        /usr/bin/openssl req $(UTF8) -new -key $(KEY) -x509 -days 365 -out $(CRT                                      ) -set_serial $(SERIAL)


普通分类: