天天看点

Linux下https的搭建总结

TLS:传输层安全协议 Transport Layer Security的缩写

SSL:安全套接字层 Secure Socket Layer的缩写

KEY 通常指私钥。

CSR 是Certificate Signing Request的缩写,即证书签名请求,这不是证书,可以简单理解成公钥,生成证书时要把这个提交给权威的证书颁发机构。

CRT 即 certificate的缩写,即证书。

X.509 是一种证书格式.对X.509证书来说,认证者总是CA或由CA指定的人,一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。

X.509的证书文件,一般以.crt结尾,根据该文件的内容编码格式,可以分为以下二种格式:

PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN..."开头, "-----END..."结尾,内容是BASE64编码.

Apache和*NIX服务器偏向于使用这种编码格式.

DER - Distinguished Encoding Rules,打开看是二进制格式,不可读.

Java和Windows服务器偏向于使用这种编码格式

OpenSSL 相当于SSL的一个实现,如果把SSL规范看成OO中的接口,那么OpenSSL则认为是接口的实现。接口规范本身是安全没问题的,但是具体实现可能会有不完善的地方,比如之前的"心脏出血"漏洞,就是OpenSSL中的一个bug.

openssl 给自己颁发证书的步骤:

前提:先建一个cert目录,cd到该目录,以下所有命令的当前路径均为该目录

1. 生成私钥KEY

<code>openssl genrsa -des3 -out server.key 2048</code>

这一步执行完以后,cert目录下会生成server.key文件

2. 生成证书请求文件CSR

<code>openssl req -new -key server.key -out server.csr</code>

该命令先进入交互模式,让你填一堆东西,参考下图:

Linux下https的搭建总结

要注意的是Common Name这里,要填写成使用SSL证书(即:https协议)的域名或主机名,否则浏览器会认为不安全。例如:如果以后打算用https://yjm-docker/xxx 这里就填写yjm-docker

3. 生成CA的证书

前面提过X.509证书的认证者总是CA或由CA指定的人,所以得先生成一个CA的证书

<code>openssl req -new -x509 -key server.key -out ca.crt -days 3650</code>

4. 最后用第3步的CA证书给自己颁发一个证书玩玩

<code>openssl x509 -req -days 3650 -</code><code>in</code> <code>server.csr \</code>

<code>  </code><code>-CA ca.crt -CAkey server.key \</code>

<code>  </code><code>-CAcreateserial -out server.crt</code>

执行完以后,cert目录下server.crt 就是我们需要的证书。当然,如果要在google等浏览器显示出安全的绿锁标志,自己颁发的证书肯定不好使,得花钱向第三方权威证书颁发机构申请(即:第4步是交给权威机构来做,我们只需要提交server.key、server.csr,哦,还有毛爷爷就好了)

[root@ www.linuxidc.com certs]#yum install mod_ssl*改变文件的权限增加安全性

[root@ www.linuxidc.com certs]#vim /etc/httpd/conf.d/ssl.conf  捆绑证书文件和钥匙文件

112 SSLCertificateFile/etc/httpd/certs/httpd.cert

119 SSLCertificateKeyFile/etc/httpd/certs/httpd.key

128 SSLCertificateChainFile/etc/httpd/certs/cacert.pem

<a href="http://s5.51cto.com/wyfs02/M00/7D/0D/wKioL1bfgs3TohtpAAD0BYIwsLY923.png" target="_blank"></a>

<a href="http://s2.51cto.com/wyfs02/M00/7D/0D/wKioL1bfgs7irFjeAABzHk8gQSU435.png" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/7D/0E/wKiom1bfgkzAeYa-AAC_hY45fhE497.png" target="_blank"></a>

<a href="http://s1.51cto.com/wyfs02/M01/7D/0D/wKioL1bfgtCwyzlhAACzHwHtN7M675.png" target="_blank"></a>

<a href="http://s5.51cto.com/wyfs02/M02/7D/0E/wKiom1bfgk7Cg7HbAABhyOgpMUU729.png" target="_blank"></a>

192.168.1.200www.abc.com

<a href="http://s1.51cto.com/wyfs02/M02/7D/0D/wKioL1bfgvjStMPnAAFk6eM2WQs162.png" target="_blank"></a>

[root@ www.linuxidc.com certs]#netstat -tupln |grep httpd

tcp       0      0:::80                      :::*                       LISTEN     5544/httpd         

tcp       0      0:::443                     :::*                       LISTEN      5544/httpd    

<a href="http://s2.51cto.com/wyfs02/M00/7D/0E/wKiom1bfgpnTN-0MAAE5zZiPEeU017.png" target="_blank"></a>

关闭原来的80端口

[root@ www.linuxidc.com certs]# vim/etc/httpd/conf/httpd.conf

134 #Listen 80 注释掉该行

[root@ www.linuxidc.com certs]# servicehttpd restart

Stoppinghttpd:                                           [  OK  ]

Startinghttpd:                                           [  OK  ]

[root@ www.linuxidc.com certs]# netstat-tupln|grep httpd

tcp       0      0:::443                     :::*                       LISTEN      5483/httpd

<a href="http://s3.51cto.com/wyfs02/M00/7D/0D/wKioL1bfgz-jCGE9AAGimBntlc8163.png" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M02/7D/0E/wKiom1bfgr6gnldBAAFhdig441Y573.png" target="_blank"></a>

这样www.abc.com就只能够使用https进行访问啦

补充:

一:为www.abc.com 颁发证书192.168.1.200的主机

[root@zzu certs]#vim/etc/httpd/conf.d/ssl.conf

nameVirtualHost 192.168.1.200:443

&lt;VirtualHost 192.168.1.200:443&gt; 

DocumentRoot "/var/www/html" 

ServerName www.abc.com:443 

ErrorLog logs/ssl_error_log 

TransferLog logs/ssl_access_log 

LogLevel warn 

SSLEngine on 

SSLProtocol all -SSLv2 

SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW 

SSLCertificateFile /etc/httpd/certs/httpd.cert 

SSLCertificateKeyFile /etc/httpd/certs/httpd.key 

SSLCertificateChainFile /etc/pki/CA/cacert.pem 

&lt;Files ~ "\.(cgi|shtml|phtml|php3?)$"&gt; 

    SSLOptions +StdEnvVars 

&lt;/Files&gt; 

&lt;Directory "/var/www/cgi-bin"&gt; 

&lt;/Directory&gt; 

SetEnvIf User-Agent ".*MSIE.*" \ 

         nokeepalivessl-unclean-shutdown \ 

         downgrade-1.0force-response-1.0 

CustomLog logs/ssl_request_log \ 

          "%t %h%{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" 

&lt;/VirtualHost&gt;

二:为 tec.abc.com 颁发证书192.168.1.100的主机

&lt;VirtualHost 192.168.1.100:443&gt; 

DocumentRoot "/var/www/tec" 

ServerName tec.abc.com:443 

SSLCertificateFile /etc/httpd/certs/httpd1.cert 

SSLCertificateKeyFile /etc/httpd/certs/httpd1.key 

1). 看SSLCertificateFile,SSLCertificateKeyFile两个配置项,所以应该在httpd下建立子目录certs,然后把签署过的证书文件(.cert)和私钥文件(.key)放在相应的目录 

2). 看DocumentRoot,ServerName配置项,ServerName修改为任意你想要得域名,注意:前面生成.csr时输入的Common Name必须于这里的ServerName项一致。 

这样启动apache后,访问https://www.my.com将访问/var/www/tec目录下的内容。 

3). 移除注释行 

LoadModule ssl_module modules/mod_ssl.so 

本文转自 转身撞墙角 51CTO博客,原文链接:http://blog.51cto.com/chentianwang/1749013

继续阅读