前言
在互联网通信之中,安全还是比较重要的,从一开始的http协议发展到https协议,也是为了安全考虑,也就是有secure http,安全的http协议传输,两者使用的是相同的协议传输,不过https加了一个安全层,为tls/ssl,从而也就有了https。
在linux上,主要使用openssl来实现,因为在安全传输的时候,只要建立ssl会话即可,从而实现安全的密钥交换,传输,数据加密,数据完整性等操作。
https的CA端的设置
https的CA端,只要作用是为了实现自签证书,并且签署客户端的证书申请,具体使用的脚本如下所示:
#!/bin/bash
cd /etc/pki/CA
(umask 077;openssl genrsa -out private/cakey.pem 2048 &>/dev/null)
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655 -subj "/C=CN/ST=Jiansu/L=Nanjin/O=KEL/OU=IT/CN=www.kel.com/emailAddress=kel@admin.com"
touch index.txt serial crlnumber
echo 01 > serial
以上第一步生成自签证书的服务端,在设置umask的时候,主要是为了设置权限保证安全性;第二部是为了生成自签证书;第三步主要是创建相关的文件。
第二步的参数中,C表示国家,CN表示中国,ST表示江苏省,L表示南京,O表示组织的名称,OU表示所在的部门,CN表示主机的名称,emailAddrss表示邮箱地址。
执行完成之后,生成如下文件:
[root@mogilenode1 CA]# pwd
/etc/pki/CA
[root@mogilenode1 CA]# tree
.
├── cacert.pem (自签证书)
├── certs
├── crl
├── crlnumber
├── index.txt
├── newcerts
├── private
│ └── cakey.pem (CA的私钥文件)
└── serial
4 directories, 5 files
http客户端设置
http客户端设置,主要是生成私钥文件和申请,给CA进行签署,生成私钥文件和申请如下所示:
#!/bin/bash
servername=www.kel.com
(umask 077;openssl genrsa -out httpd.key 1024 &>/dev/null)
openssl req -new -key httpd.key -out httpd.csr -subj "/C=CN/ST=Jiansu/L=Nanjin/O=KEL/OU=IT/CN=$servername/emailAddress=kel@admin.com"
执行完成之后,生成如下文件:
[root@mogilenode1 ssl]# ls -l
total 12
-rw-r--r-- 1 root root 680 Sep 17 05:44 httpd.csr (证书申请)
-rw------- 1 root root 887 Sep 17 05:44 httpd.key (证书密钥)
servername每次是可以修改的,也就是修改成对应的主机名称,邮箱地址也是可以修改的,其他的部分必须保持一致。
签署申请
将httpd.csr发送到CA,然后CA进行签署申请如下:
[root@mogilenode1 ssl]# openssl ca -in httpd.csr -outhttpd.crt -days 3655
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Sep 17 09:47:00 2017 GMT
Not After : Sep 20 09:47:00 2027 GMT
Subject:
countryName = CN
stateOrProvinceName = Jiansu
organizationName = KEL
organizationalUnitName = IT
commonName = www.kel.com
emailAddress = kel@admin.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
08:11:83:92:7A:0B:A7:4A:12:67:6C:56:CC:65:F9:E3:94:33:6E:99
X509v3 Authority Key Identifier:
keyid:D4:DE:73:06:16:BD:9A:4D:00:06:69:05:CC:89:27:BC:30:FD:64:AC
Certificate is to be certified until Sep 20 09:47:00 2027 GMT (3655 days)
Sign the certificate? [y/n]:yes
1 out of 1 certificate requests certified, commit? [y/n]yes
Write out database with 1 new entries
Data Base Updated
httpd的配置
在httpd中,需要首先启用ssl,并且编译的时候要编译了此模块,编译的选项使用的是--enable-ssl,检查如下:
[root@mogilenode1 bin]# ./httpd -l |grep mod_ssl (已经编译ssl)
mod_ssl.c
[root@mogilenode1 conf]# grep ssl httpd.conf (主配置文件中启用ssl)
Include conf/extra/httpd-ssl.conf
[root@mogilenode1 extra]# grep httpd. httpd-ssl.conf (指定httpd的密钥文件和httpd的证书文件)
SSLCertificateFile "/usr/local/apache2/conf/ssl/httpd.crt"
SSLCertificateKeyFile "/usr/local/apache2/conf/ssl/httpd.key"
[root@mogilenode1 extra]# pwd(路径)
/usr/local/apache2/conf/extra
然后重启即可:
[root@mogilenode1 extra]# /usr/local/apache2/bin/httpd -k restart
httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.249.236 for ServerName
[root@mogilenode1 extra]# netstat -ntlp|grep httpd (查看是否监听443端口)
tcp 0 0 :::80 :::* LISTEN 961/httpd
tcp 0 0 :::443 :::* LISTEN 961/httpd
测试
进行测试如下:
[root@mogilenode1 CA]# cat /etc/hosts(设置主机解析)
192.168.249.236 mail.kel.com
[root@mogilenode1 CA]# curl --cacert cacert.pem https://www.kel.com (使用证书进行https连接,否则无法连接)
<html><body><h1>It works!</h1></body></html>
在测试的时候,也可以将cacert.pem文件下载到windows,然后修改后缀为crt,然后安装导入证书,使用浏览器访问,注意也要进行主机解析设置,也就是设置hosts文件,必须使用指定的域名进行访问。
可能还是不受信任的,主要和浏览器的安全设置有关。
那么问题来了,为啥要使用CA呢?也就是为啥需要证书颁发机构呢?在使用https的时候,必须进行公钥交换,那么怎么来信任这个公钥是对应的主机发送过来的呢?从而需要使用第三方认证机构,也就是一套的pki,公钥基础设施,来进行保证公钥是对的,从而实现安全通信。