上几次博文我们具体讨论了Apache(httpd)的基础知识:

HTTP协议基础(参见博文:http://sweetpotato.blog.51cto.com/533893/1656137

Apache2.2的基本配置(参见博文:http://sweetpotato.blog.51cto.com/533893/1657668

Apache2.2的虚拟主机(参见博文:http://sweetpotato.blog.51cto.com/533893/1660229

本次博文我们具体讨论下加密/解密原理、自建CA及用https实现基于SSL的Apache

【本次博文的主要内容】

  • 加密解密基础;

  • 典型的数据加密算法及加密原理;

  • 数字证书及PKI

  • 通过Openssl实现私有CA

  • 自建CA/证书签署脚本


一、加密解密基础:

1、问题的引入:文件加密的过程是怎样的?

【答】文件加密的过程就是对原来为明文的文件或数据按照某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”。该过程的的逆过程称为“解密”。

2、网络安全的三个关键目标(CIA):

spacer.gifwKiom1V5ar6ixKCUAAEYLlRutRk006.jpg

说明:

(1)机密性(Confidentiality):信息不泄露给非授权用户、实体或过程,或供其利用的特性。

(2)完整性(Integrity):数据未经授权不能进行改变的特性。即信息在存储或传输过程中保持不被修改、不被破坏和丢失的特性;

(3)可用性(Availability):可被授权实体访问并按需求使用的特性。即当需要时能否存取所需的信息。例如网络环境下拒绝服务、破坏网络和有关系统的正常运行等都属于对可用性的***;

3、文件加密和数字签名的应用:

按作用的不同,文件加密和数字签名技术主要分为如下几类:

(1)数据传输加密技术:对传输中的数据流加密,常用的方法有线路加密和端对端加密两种。

(2)数据存储加密技术:目的是防止在存储环节上的数据失密,可分为密文存储和存取控制两种。

(3)数据完整性鉴别技术:对介入信息的传送、存取、处理的人的身份和相关数据内容进行验证,达到保密的要求(一般包括口令、密钥、身份、数据等项的鉴别)。

(4)密钥管理技术:以上三种数据加密技术通常是运用密钥对数据进行加密,这就涉及了一个密钥的管理方面。因为用密钥软件进行加密时,所用的密钥通常达到64bit,有的达到256bit。一般不可能完全用大脑来记住,只能保存在一个安全的地方,这就涉及到了密钥的管理技术。

4、常见的加密技术:

(1)对称加密:同时运用一个密钥进行加密和解密(依赖于密钥来实现,算法是公开的);

(2)非对称加密:加密和解密所用的密钥不一样,它有一对密钥,称为“公钥”和“私钥”,这一对密钥必须配对使用(即公钥加密的文件必须用相应的私钥才能解密,反之亦然)。最流行的非对称加密技术是PGP。

通过数学函数来实现(费马定理、欧拉定理);有兴趣的朋友可以到网上搜索相关资料,这里不具体阐述。


二、典型的数据加密算法及各自的加密原理:

目前流行的加密标准有4种:DES、MD5、SHA-1、RSA。可以归纳为两大类:1、基于“信息摘要”的算法;2、“对称/非对称密钥”;下面进行简单介绍:

1、基于“信息摘要”的算法:

(1)定义:“信息摘要(Message Digest)是一种能产生特殊输出格式的算法。这种加密算法的特征是无论输入什么长度的原始数据,经过计算后输出的密文都是固定长度的。

(2)原理:根据一定的运算规则对原数据进行某种形式的提取,这种提取就是“摘要”,也叫“特征码”

(3)特性:单向加密仅支持从明文-->密文,提取数据特征码

  • 无论输入是多大的数据,其输出是定长的;      

  • 如果输入的数据一样,其结果一定一样;反之,输入数据微小改变,将引起结果的巨大改变,这种现象称之为“雪崩效应”;      

(4)常见的基于“信息摘要”的 算法:md5(message digest),SHA(Secure Hash Algorithm)

  • md5: 无论输入是多长,输出为定长128bits  

  • SHA1: 无论输入是多长,输出为定长160bits      

  • SHA-256: 无论输入是多长,输出为定长256bits      

  • SHA-512: 无论输入是多长,输出为定长512bits 

(5)应用场合:数字签名(发送方使用单向取得数据特征码,并使用自己的私钥加密此段特征码的操作);保证数据的完整性。

MD5应用举例:Linux系统上的典型应用--保存在/etc/shadow中的用户密码  

[root@rhel5 home]# openssl passwd -1 -salt 12345678 redhat
$1$12345678$0ME5N6oDyoEAwUp7b5UDM/
[root@rhel5 home]# openssl passwd -1 -salt 12345678 redhat    
$1$12345678$0ME5N6oDyoEAwUp7b5UDM/  #可以看到,两次输入的salt相同,加密后生成的密码是相同的哈
[root@rhel5 home]# openssl passwd -1 -salt 12345698 redhat    
$1$12345698$jX8ffqc5lSEfqT.NXmyP2.  #这里可以看到,两次输入的salt有细微的差别,则生成的密码差别甚大

2、“对称/非对称密钥”加密算法:

由于“信息摘要”算法加密的数据仅仅能作为一种身份验证的凭据使用,如果我们要对整个文档数据进行加密,就不能采用这种“单向加密”的算法。

(1)对称加密:加密和解密使用同一个密钥;

最常见的为:DES(Data Encryption Standard),3DES(3轮DES加密), AES(Advanced Encrption Standard);密钥管理及分发功能很差;   

【对称加密的特性】:

  • 不能保证可用性;

  • 不能防止中间人*** ;        

  • 能够保证数据机密性;

问题引入:非对称加密的必要性--Bob和Alice从未谋面,他们需要在互联网上进行机密通信,用对称加密可以实现吗?

答:不能实现哈,这时非对称加密机制就应运而生了。

(2)非对称加密:RSA,DSS,ECC

采用DH(密钥交换算法)算法实现加密;

公钥是从私钥提取而来

私钥加密的数据-->只能通过与之配对的公钥解密

公钥加密的数据-->只能通过与之配对的私钥解密

思考:

Bob使用自己的私钥加密,其公钥是公开的,谁都能获得,那有意义吗?

答:有意义,能够实现身份验证(该数据用Bob的公钥加密,只有Bob的私钥才能解密,即能用公钥解密则可以证明该段数据一定是Bob加密的)。

Bob用Alice的公钥加密,那只有Alice的私钥才能解密有什么意义?

答:数据的机密性得到保证。

RSA:最流行的公钥加密算法,使用长度可变的密钥。它是第一个既能用于数据加密也能用于数字签名的算法。

功能:身份验证,密钥交换,机密性

说明:非对称加密是通过数学函数来实现的,效率较对称加密低三个数量级


3、公钥分发(DH算法)原理:wKiom1V5fcORGlCSAAFDkfvsv3Q646.jpg

【算法】:

1、Bob和Alice协商生成公开的两个大素数q和a;

2、Bob用Xm计算a^Xm%q,结果发给Alice;

3、Alice用Xn计算a^Xn%q,结果发给Bob;

4、Bob用Alice发来的结果计算出结果:(a^Xn%q)^Xm%q=^XnXm%q

5、Alice用Bob发来的结果计算出结果:(a^Xm%q)^Xn%q=^XmXn%q

可以看到最终的计算结果是相同的。

说明:

  • 在网上传输的数据有:两个素数q、a及中间结果a^Xm%q、a^Xn%q

  • Xm、Xn是私有的,不在网上传输(由中间结果逆推出Xm、Xn是不可能的)

  • 此算法的缺陷--无法防止中间人***。


4、一次完整的传输加密解密过程:spacer.gif

wKiom1V-frqSWIKkAAISgOlLo9I240.jpg

发送方:

(1)发送方使用选定的单向加密算法计算原始数据的特征码;

(2)发送方使用自己的私钥加密特征码,附加于原始数据后面(数字签名);

(3)发送方生成一次性对称密钥,并使用此密钥加密数据(原始数据+加密后的特征码);

(4)发送方使用接收方的公钥加密一次性对称密钥,附加于加密数据后面

(5)发送;

接收方:

(1)接收方使用自己的私钥解密加密的一次性对称密钥;

(2)使用对称密钥解密数据,得到加密的特征码和原始数据;

(3)使用发送方的公钥解密加密的特征码;

(4)使用与发送方相同的单向加密算法重新计算数据的特征码,并与解密出的特征码做比较

说明:

这个传输过程的缺陷是:公钥在网络上传输时,无法验证其可信度,容易被劫持或伪装,因此需要第三方权威认证机构(即CA)


三、数字证书及PKI:

1、数字证书:

(1)数字证书是什么?

证书其实就是一种数字签名的声明,它将公钥绑定到持有对应私钥的个人、设备或服务的身份。目前最流行的版本:x.509v3

(2)数字证书的结构:

    版本号(version)

    序列号():证书本身在CA中惟一标识;

    签名算法标志

    发行者名称

    有效期

    证书主体名称:(组织(主机),个人)

    证书主体公钥信息

    发行商惟一标志

    证书主体的惟一标志

    扩展信息

    签名

2、PKI(公钥基础结构):

(1)PKI是什么?

Public Key Infrastructure PKI是一种规范,它是使用公开密钥技术和数字证书来确保系统信息安全,并负责验证数字证书持有者身份的一种体系。

(2)PKI的组成:

    端实体(申请者)

    注册机构(RC)

    签证机构(CA)-->签证机构(CA):完成交叉信任

    证书撤消列表(CRL)发布机构

    证书存取库 

 说明:PKI与CA的关系

很多小伙伴搞不清楚PKI与CA,这里具体来阐述下:

PKI是一种规范(类似于OSI参考模型),类似于DNS的分布式结构,如下图所示:

wKioL1V-geezHKQLAAFFFY7nqaQ874.jpg

CA是PKI的一个机构,专门负责证书的签署(颁发)。


四、通过Openssl实现私有CA:

互联网上大多数协议都是明文传输的(例如:HTTP、SMTP、POP3、IMAP4、TELNET、FTP等),那如何保证数据传输是密文传输的呢?

各种加密传输技术应运而生:SSL/TLS、SSH、HTTPS、***等,这些都是面向OSI参考模型不同层实现的加密技术。

【各种常用协议对应的加密协议】

    http: 80/tcp   https: 443/tcp(在传输层之上加了半层)    

    smtp: 25/tcp   smtps: 465/tcp

    pop3: 110/tcp  pops: 995/tcp    

1、SSL/TLS协议:

SSL: Secure Socket Layer(安全套接字层:由网景公司创建),通过一种机制在互联网上提供密钥传输。其主要目标是保证两个应用间通信数据的保密性和可靠性,可在服务器端和用户端同时支持的一种加密算法。目前主流版本SSLV2、SSLV3(常用)。

TLS:Transport Lanyer Security:由于网景公司的没落,IETF将SSL进行标准化,1999年公布了TLS标准文件。

常用的版本:TLS v1(与SSL v3基本相同)

【常用证书协议】

x509v3: IETF的证书标准

x.500:目录的标准

SCEP:  简单证书申请协议,用http来进行申请,数据有PKCS#7封装,数据其实格式也是PKCS#10的

PKCS#7:  是封装数据的标准,可以放置证书和一些请求信息

PKCS#10:  用于离线证书申请的证书申请的数据格式,注意数据包是使用PKCS#7封装这个数据

PKCS#12:  用于一个单一文件中交换公共和私有对象,就是公钥,私钥和证书,这些信息进行打包,加密放在存储目录中,CISCO放在NVRAM中,用户可以导出,以防证书服务器挂掉可以进行相应恢复。思科是.p12,微软是.pfx

2、SSL/TLS的工作原理:

wKiom1V-iNGgk7hDAACdhvk_N70592.jpg

【SSL的会话过程】:

如下图所示:

wKioL1V-gtqjQdyiAAIL1PAjjkU174.jpg

说明:前提服务器端在本地通过非对称加密算法生成一对密钥,并将公钥信息发送给CA证书颁发机构,CA给服务器端颁发数字证书,并将证书发送至服务器端。    

SSL会话建立过程:   

第一步:客户端向服务器端建立连接请求(TCP/IP);  

第二步:当TCP/IP建立完成后,客户端和服务器之间协商使用哪种加密算法,常用的如(TSLv1/SSLv2/SSLv3);   

第三步:协商完成后,服务器将公钥发送给客户端,客户端接收公钥信息;

第四步:客户端到CA证书颁发机构下载CA公钥信息,并对服务器端发送的证书做验证;    

第五步:随后,客户端在本地通过对称加密算法生成密钥,然后用服务器端发送的公钥进行对这段密钥进行加密,发送至服务器端,其保证了数据的机密性;    

第六步:服务器用自己的私钥对这段数据进行解密,得到密钥,然后将客户端的请求数据进行加密发送给客户端;

第七步:客户端接到响应,并用密钥进行机密,得到数据;

第八步:通信结束后,断开会话通道(TCP/IP) ; 


3、SSL/TLS的开源实现:openssl

(1)openssl的rpm包及命令行工具:

OpenSSL:SSL的开源实现       
    libcrypto:通用加密库,提供了各种加密函数       
    libssl:TLS/SSL协议的实现,基于会话的、实现了身份认证、数据机密性和会话完整性的TLS/SSL库       
    openssl:多用途的命令行工具;能够实现私有证书颁发机构;即在公司内部实现身份的验证;  
openssl:openssl命令行工具       
    genrsa:通过RSA算法,生成密钥(私钥和公钥)       
    req:申请和生成证书       
        -new:生成新的证书      
        -x509:互联网常用的一种标准 
        -in:证书的位置(签署证书及证书请求常常用到)       
        -out:证书的存放位置       
        -days:证书的有效期限

(2)openssl的配置文件:

[root@Centos CA]# rpm -qc openssl
/etc/pki/tls/openssl.cnf    #配置文件所在位置
[root@Centos CA]# vim /etc/pki/tls/openssl.cnf 
[ CA_default ]
 
dir             = /etc/pki/CA           # CA的默认工作目录
certs           = $dir/certs            # 所生成的客户端证书的存放位置
crl_dir         = $dir/crl              # 证书吊销列表所在位置(这里的证书都是无效的)
database        = $dir/index.txt        # 存放客户端的相关证书信息
#unique_subject = no                    # Set to 'no' to allow creation of
                                        # several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # 新颁发证书的存放位置
 
certificate     = $dir/cacert.pem       # CA证书存放的位置
serial          = $dir/serial           # 所颁发证书的序列号
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私钥的存放位置
RANDFILE        = $dir/private/.rand    # private random number file    
 
x509_extensions = usr_cert              # The extentions to add to the cert


(3)如何申请证书:

1、生成一个私钥;
    # (umask 077; openssl genrsa -out /path/to/private_key 2048) 
2、制作一个证书签署请求;
    # openssl req -new -key /path/to/private_key -out /paht/to/certificate.csr 
3、由CA负责签署证书;
    # openssl ca -in /path/to/certreq.csr -out /path/to/certfile.crt -days 365

4、openssl实现私有CA的过程:

【实验环境】

两台虚拟机:一台CentOS6.4做为服务器(提供DNS服务、Web服务和CA证书颁发)

CA证书颁发机构并提供HTTP功能     centos6.4     192.168.1.58/24   192.168.1.60/24(用于HTTPS)

客户端    win7    192.168.1.201/24      DNS指向192.168.1.58

【准备工作】

(1)在CentOS虚拟机上安装好httpd2.2和DNS服务;

(2)DNS的区域解析库文件/var/named/webtest.com.zone的内容如下:

wKioL1V-hC6hBdgzAACQnw-sAjE089.jpg

(3)启动DNS服务;


【如何自建CA】:

# cd /etc/pki/CA/
step1:为CA生成一个私钥:
    # (umask 077; openssl genrsa -out private/cakey.pem 2048)
step2:生成自签证书:
    # openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
    # touch index.txt
    # echo 01 > serial
step3:签署证书:
    # openssl ca -in /path/to/certreq.csr -out /path/to/certfile.crt -days 365
专用客户端测试工具:
# openssl s_client -connect HOST:PORT -CAfile /path/to/cacertfile|-CApath /paht/to/cacertfiles_dir/ -ssl2|-ssl3|-tls1

【实验步骤】

step1:用yum安装openssl:

yum install -y openssl

step2:在CentOS虚拟机上,使用Openssl生成一对密钥(私钥和公钥):

[root@Centos CA]# cd /etc/pki/CA/   
[root@Centos CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048)  #创建私钥,并将权限改为600(一对括弧表示通过子shell执行命令)

step3: 生成自签证书:

[root@Centos CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650  #生成自签证书(注意:两个.pem文件是在配置文件中指定的,名称不能改)
#说明:
####openssl中有如下后缀名的文件####
    .key格式:私有的密钥
    .crt格式:证书文件,certificate的缩写
    .csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
    .crl格式:证书吊销列表,Certificate Revocation List的缩写
    .pem格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式

wKioL1V-ilDg9T2AAADdg5ctBAk901.jpg

step4:为CA准备目录及文件:

[root@Centos CA]# cd /etc/pki/CA/   
[root@Centos CA]# mkdir -pv certs crl newcerts   #证书存放目录
[root@Centos CA]# ls
cacert.pem  certs  crl  newcerts  private
[root@Centos CA]# touch index.txt serial crlnumber  #相关证书信息文件
[root@Centos CA]# ls
cacert.pem  certs  crl  crlnumber  index.txt  newcerts  private  serial
[root@Centos CA]# echo 01 > serial  #所颁发证书的序列号
[root@Centos CA]# cat serial 
01

step5:为Apache2.2安装mod_ssl模块提供TLS/SSL功能:

##1、https是通过mod_ssl实现的,因此检查并安装mod_ssl:
[root@Centos ~]# ls /etc/httpd/modules/ | grep "mod_ssl"   #默认没有安装mod_ssl
[root@Centos ~]# yum list all mod_ssl   #查看mod_ssl的安装包信息
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
Available Packages
mod_ssl.x86_64                  1:2.2.15-26.el6.centos    
[root@Centos ~]# yum install -y mod_ssl  #安装mod_ssl
##2、检查mod_ssl是安装结果
[root@Centos ~]# rpm -qc mod_ssl
/etc/httpd/conf.d/ssl.conf      #mod_ssl的配置文件存放位置

step6:编辑httpd.conf文件,新建基于IP的虚拟主机,并提供默认主页面:

##1、编辑httpd.conf,注释中心主机:
#DocumentRoot "/var/www/html"    #注释该行
##2、编辑httpd.conf,新建基于IP的虚拟主机:
<VirtualHost 192.168.1.58:80>
        ServerName httpd.webtest.com
        DocumentRoot  /website/httpd/
</VirtualHost>
##3、创建站点目录:
[root@Centos ~]# mkdir -pv /website/httpd/
mkdir: created directory `/website/httpd/'
[root@Centos ~]# ll -d /website/httpd/
drwxr-xr-x. 2 root root 4096 Jun 12 00:01 /website/httpd/  #成功创建了站点目录了哈
##4、提供默认主页面:
[root@Centos ~]# vim /website/httpd/index.html
<h2>httpd.webtest.com:192.168.1.58</h2>   
##5、重启httpd服务:
[root@Centos ~]# service httpd restart

step7:在win7客户端浏览器中验证结果:

wKiom1V-hHSQR9LZAADSuG-R8Iw624.jpg

可以看到,Apache服务正常运行。

step8:为Apache服务器端配置密钥并生成证书签署请求文件:

##1、为Apache服务器端配置密钥
[root@Centos ~]# mkdir -pv /etc/httpd/ssl
mkdir: created directory `/etc/httpd/ssl'
[root@Centos ~]# ls /etc/httpd
conf  conf.d  logs  modules  run  ssl   #已然创建了ssl目录
[root@Centos ~]# cd /etc/httpd/ssl
[root@Centos ssl]# (umask 077;openssl genrsa -out httpd.key 1024)   #为Apache服务器生成密钥
[root@Centos ssl]# ls
httpd.key    #密钥生成了哈(该密钥文件名可自定义)
##2、生成证书签署请求文件:
[root@Centos ssl]# openssl req -new -key httpd.key -out httpd.csr  #.csr证书请求文件名可自定义

wKiom1V-iISQiE8WAAFxsBmMm30853.jpg

step9:CA为Apache服务签署数字证书:

[root@Centos ~]# cd /etc/httpd/ssl/
[root@Centos ssl]# openssl ca -in httpd.csr -out httpd.crt -days 3650  #CA签署证书

wKiom1V-hTOjHnxGAAIletLTFIY852.jpg

step10:查看CA的颁发的证书信息:

wKiom1V-iGCh8jyuAADUhGCAbJs918.jpg

step11:配置SSL的主配置文件(/etc/httpd/conf.d/ssl.conf),并在相应的DocumentRoot目录下创建默认主页面意:https不支持基于主机名的虚拟主机,仅能支持基于IP的虚拟主机)

##1、找到<VituralHost>虚拟主机配置段,配置如下:
<VirtualHost 192.168.1.60:443>
    DocumentRoot  /website/https
    ServerName    https.webtest.com
##2、找到Server Certificate服务器认证段,配置如下:
SSLCertificateFile /etc/httpd/ssl/httpd.crt  #认证文件改为我们前面创建的
##3、找到Server Private Key服务器私钥存放段,配置如下:
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key  #私钥文件改为我们前面创建的

step12:重启httpd服务,并查看相应的443端口是否属于正常打开状态:

wKioL1V-h4exhLs8AACXvIZWB9I029.jpg

step13:将CA的公钥信息下载到win7客户端并重命名为cacert.crt,并安装此证书然后在浏览器中测试结果:

wKiom1V-hmSTC9_XAAAviS4V6ug671.jpg


wKiom1V-hjiTXNRVAAKw7Ns-zrg710.jpg

wKioL1V-h-mD2gQpAAGm06tQBPA994.jpg

然后使用https://https.webtest.com验证是否可以正常访问:

wKioL1V-iEWx890aAAEiofT3cgo975.jpg



小结:

1、以一张图来总结下本次博文的主要内容(该图片来源于小小忍者的博文:http://xxrenzhe.blog.51cto.com/4036116/1370114

wKiom1V-hviCpIhZAAL0XOoZOzE862.jpg

特别注意:https不支持基于主机名的虚拟主机,仅能支持基于IP的虚拟主机(这是SSL/TLS固有的缺陷)。


2、给出自建CA和证书签署的脚本(此脚本经过本人测试可用,不尽完善的地方欢迎大家指正!~~):

*********************************自建CA的Shell脚本**************************************************

#!/bin/bash
#########################################################################
# File Name: MakeCA.sh
# Author: 土豆呼叫地瓜
# Email: 229293602@qq.com
# Created Time: 2015年06月15日 星期一
#########################################################################
#设定CA工作目录
dir=${dir:-/etc/pki/CA}
certs=${certs:-$dir/certs }
crl_dir=${crl_dir:-$dir/crl}
private_key_dir=${private_key_dir:-$dir/private}
new_certs_dir=${new_certs_dir:-$dir/newcerts}   
#自签证书相关的3个文件
database=${database:-$dir/index.txt}
serial=${serial:-$dir/serial}
crlnumber=${crlnumber:-$dir/crlnumber} 
#私钥文件(根密钥)
private_key=${private_key:-$private_key_dir/cakey.pem}
#自签证书
certificate=${certificate:-$dir/cacert.pem}
#生成CA
makeCA() {
	[ ! -d $dir ] && mkdir -p $dir
	[ ! -d $private_key_dir ]  && mkdir -p $private_key_dir
    # 创建CA私钥
    if [ ! -f $private_key ];then 
    	(umask 077; openssl genrsa -out $private_key 2048)
    fi
    # 生成自签证书
    if [ ! -f $certificate ];then
		openssl req -new -x509 -key $private_key -out $certificate -days 3650
	fi
	# 生成三个目录
	[ ! -d $certs -a ! -d $crl_dir -a ! -d $new_certs_dir ] && mkdir -p $certs $crl_dir $new_certs_dir
	# 生成自签证书相关的3个文件
	touch $database $serial $crlnumber  && echo 01 > $serial
}
makeCA
echo "Make CA successfully.The newCA is $new_certs_dir."


********************************证书签署的Shell脚本***************************************************

#!/bin/bash
#########################################################################
# File Name: CA_Signed.sh
# Author: 土豆呼叫地瓜
# Email: 229293602@qq.com
# Created Time: 2015年06月15日 星期一
#########################################################################
#Where is the crt saved
read -p "Plz input a path to save the certifacate:" crtDir
#简单判断用户给的目录名称是否合法
if [[ ! "$crtDir" =~ ^/.*[[:alnum:]]$ ]];then
    echo "$crtDir is the invalid path."
    echo "The Path should be such as '/path/to/somedir"
    exit 10
fi
#Where is the key saved
cakey=${cakey:-$crtDir/cakey.key}
#Where is the csr saved
csr=${csr:-$crtDir/certreq.csr}
#Where is the crt saved
crt=${crt:-$crtDir/cacert.crt}
#General a private key
if [ ! -d $crtDir ];then
mkdir -p $crtDir
else if [ ! -f $cakey ];then
        (umask 077; openssl genrsa -out $cakey 1024)
     fi
fi
#General .csr file
if [ ! -f $csr ];then
    openssl req -new -key $cakey -out $csr
fi
#Make the certficate
if [ ! -f $crt ];then
    retval=0
    openssl ca -in $csr -out $crt -days 3650
    [ $retval -nt 0 ] && echo "The certificate is created failure." && rm -f $crt
    echo "$crt is created successfully. It is placed in $crtDir."
else
    find $crt -size 0 | xargs rm -f
    echo "$crt is bad, try to create it again."
fi

3、OPENSSL 生成证书的报错处理:

(1)生成证书报错为:

Error:Serial number 01 has already been issued,check the database/serial_file for corruption the matching entry has the fallowing details;

这个错误主要是服务器上产生多个证书,需要修改生成证书的序列号;

查看这些信息存放目录,在文件openssl.cnf文件中

vim /etc/pki/tls/openssl.cnf
[ CA_default ]
dir = /etc/pki/CA

在这个目录下:serial内容为00 需要修改当前的数字,使用16进制数字 如 echo “0E” > serial 

(2)生成证书错误为:

filed to update database
TXT_DB error number 2

该错误解决方法有2种:(1)在CA目录下,将index.text.addr 中的 unique_subject = yes 修改为 unique_subject = no;(2) 是删除 index.txt 然后创建一个新的index.txt


本次博文的内容就这么多哈,欢迎大家指正!~~下次我们来讨论如何编译安装Apache2.4及看看Apache2.4有哪些新特性!