专栏首页MyPanda的学习笔记数字证书系列--用证书搭建https网站

数字证书系列--用证书搭建https网站

在前面一节介绍了如何创建CA, 以及如何用CA对CSR 证书请求文件进行签名,从而生成签名的服务器端证书。生成签名证书不是我们的最终目的,利用生成的签名证书来加密通信才是我们要达到的目的;这里跟我一起来学习如何使用这个签名的证书来搭建最简单的https网站:

  1. 安装httpd包以及mod_ssl包,默认情况下,apache允许http以及https连接,通过curl的方式验证http网站是可以访问的. 然而访问https的时候,可以看到加密的 https://127.0.0.1 在默认情况下是无法访问的;报告“curl: (60) Issuer certificate is invalid.”错误,这是因为还没有可用证书的原因.
[root@localhost conf.d]# lsof -i:443
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   4761   root    6u  IPv6  45014      0t0  TCP *:https (LISTEN)
httpd   4762 apache    6u  IPv6  45014      0t0  TCP *:https (LISTEN)
httpd   4763 apache    6u  IPv6  45014      0t0  TCP *:https (LISTEN)
httpd   4764 apache    6u  IPv6  45014      0t0  TCP *:https (LISTEN)
httpd   4765 apache    6u  IPv6  45014      0t0  TCP *:https (LISTEN)
httpd   4766 apache    6u  IPv6  45014      0t0  TCP *:https (LISTEN)
[root@localhost conf.d]# lsof -i:80
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd   4761   root    4u  IPv6  45006      0t0  TCP *:http (LISTEN)
httpd   4762 apache    4u  IPv6  45006      0t0  TCP *:http (LISTEN)
httpd   4763 apache    4u  IPv6  45006      0t0  TCP *:http (LISTEN)
httpd   4764 apache    4u  IPv6  45006      0t0  TCP *:http (LISTEN)
httpd   4765 apache    4u  IPv6  45006      0t0  TCP *:http (LISTEN)
httpd   4766 apache    4u  IPv6  45006      0t0  TCP *:http (LISTEN)

[root@localhost conf.d]# curl -I https://127.0.0.1/
curl: (60) Issuer certificate is invalid.
More details here: http://curl.haxx.se/docs/sslcerts.html
curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
[root@localhost conf.d]# curl -I http://127.0.0.1/
HTTP/1.1 403 Forbidden
Date: Tue, 17 Sep 2019 10:58:14 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8
[root@localhost conf.d]# 
  1. 在配置https之前,查看我们之前生成的签名证书以及私钥,我们需要这些信息来配置https加密.
[root@localhost cert_test]# ls -l
total 24
-rw-------. 1 root root 1359 Aug 18 21:31 CA_Cert.pem   #CA证书
-rw-------. 1 root root 1675 Aug 18 21:20 CA_Key.key  #CA的私钥
-rw-r--r--. 1 root root 1021 Aug 18 17:23 my_cert.csr  #服务端证书请求文件
-rw-------. 1 root root 4509 Aug 18 22:12 my.crt       #由CA签名之后的服务端证书
-rw-r--r--. 1 root root 1679 Aug 18 17:18 myprivate.key     #服务端证书的私钥
[root@localhost cert_test]#
  1. 切换到httpd的配置目录,然后找到conf.d/ssl.conf文件,查看SSLCertificateFile, SSLCertificateKeyFile 参数的值, 并按照如下的值进行修改,然后把签名的服务器证书以及私钥放置到相应的路径下:
[root@localhost conf.d]# grep SSLCertificate ssl.conf  | grep -Evi ^#
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
#修改上述参数的值,修改后如下:
[root@localhost conf.d]# grep SSLCertificate ssl.conf  | grep -Evi ^#
SSLCertificateFile /etc/httpd/conf.d/my.crt
SSLCertificateKeyFile /etc/httpd/conf.d/myprivate.key
[root@localhost cert_test]# ls -l /etc/httpd/conf.d/myprivate.key /etc/httpd/conf.d/my.crt
-rw-r-----. 1 root root 4509 Aug 18 22:12 /etc/httpd/conf.d/my.crt
-rw-r-----. 1 root root 1679 Sep 17 21:50 /etc/httpd/conf.d/myprivate.key
[root@localhost cert_test]#
  1. 除了要提供服务器签名证书的路径外,通常需要提供 "证书链证书" 的路径,在这里,我们不需要提供"证书链证书" 的路径,因为我们是直接用CA签名的服务器证书;所以除了“服务器签名证书”外,只需要提供CA证书的路径,而不必提供“证书链证书”的信息:
[root@localhost conf.d]# grep SSLCACe ssl.conf
#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
#修改上述参数的值,修改之后如下:
[root@localhost conf.d]# grep SSLCACe ssl.conf
SSLCACertificateFile /etc/httpd/conf.d/CA_Cert.pem
[root@localhost conf.d]# cp /root/cert_test/CA_Cert.pem  /etc/httpd/conf.d/CA_Cert.pem
[root@localhost conf.d]# ls -l /etc/httpd/conf.d/CA_Cert.pem
-rw-r-----. 1 root root 1359 Sep 17 21:52 /etc/httpd/conf.d/CA_Cert.pem
[root@localhost conf.d]#
  1. 至此,https服务器的证书已经配置完成了,接下来重启httpd服务,遇到了如下的错误:
Sep 17 22:01:03 localhost.localdomain httpd[30975]: AH00526: Syntax error on line 100 of /etc/httpd/conf.d/ssl.conf:
Sep 17 22:01:03 localhost.localdomain httpd[30975]: SSLCertificateFile: file '/etc/httpd/conf.d/my.crt' does not exist or is empty
Sep 17 22:01:03 localhost.localdomain systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
Sep 17 22:01:03 localhost.localdomain kill[30977]: kill: cannot find process ""
Sep 17 22:01:03 localhost.localdomain systemd[1]: httpd.service: control process exited, code=exited status=1
Sep 17 22:01:03 localhost.localdomain systemd[1]: Failed to start The Apache HTTP Server.
-- Subject: Unit httpd.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit httpd.service has failed.

经过检查,文件是存在的, 在centos中,默认情况下,selinux是打开的,所以关闭试试,果然重启成功

[root@localhost cert_test]# setenforce 0
[root@localhost cert_test]# systemctl restart httpd.service
[root@localhost cert_test]#
  1. 至此,重启完成,用curl命令进行验证, 结果如下,提示证书是不受信任的;我们用-k参数跳过证书验证;
[root@localhost cert_test]# curl -I https://127.0.0.1/
curl: (60) Peer's certificate issuer has been marked as not trusted by the user.
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
 of Certificate Authority (CA) public keys (CA certs). If the default
 bundle file isn't adequate, you can specify an alternate file
 using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
 the bundle, the certificate verification probably failed due to a
 problem with the certificate (it might be expired, or the name might
 not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
[root@localhost cert_test]#

#用-k参数跳过证书验证,可以看到curl的结果
[root@localhost cert_test]# curl -Ik https://127.0.0.1/
HTTP/1.1 403 Forbidden
Date: Tue, 17 Sep 2019 14:20:30 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8
  1. 上面使用-k参数跳过证书验证虽然可以,但是能不能不跳过证书验证呢? 其实根据上面的提示,我们知道curl 用系统中bundle的证书来进行验证,而我们自己创建的证书当然不是系统bundle的,所以才提示“not trusted"。 但是我们可以使用:--cacert 选项来指定CA证书从而来避免该提示;
[root@localhost cert_test]# curl --cacert /etc/httpd/conf.d/CA_Cert.pem  https://127.0.0.1/
curl: (51) Unable to communicate securely with peer: requested domain name does not match the server's certificate.
[root@localhost cert_test]# 

我们发现还是报错,这次的错误是 证书绑定的域名和当前请求域名不匹配;我们前面创建证书的时候使用的域名是:www . my.com, 所以查看下证书,确认下,重新测试:

[root@localhost cert_test]#openssl x509 -in ./my.crt  -subject   #结果中指名了适用于网站www . my.com
......
#因为没有对www . my.com注册DNS, 所以我们修改/etc/hosts, 把www . my.com 指向127.0.0.1, 再重新验证:
[root@localhost cert_test]# curl -I --cacert /etc/httpd/conf.d/CA_Cert.pem  https://www.my.com/
HTTP/1.1 403 Forbidden
Date: Tue, 17 Sep 2019 11:36:36 GMT
Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8
[root@localhost cert_test]# 

至此,成功从创建证书到搭建自己的https网站完成了; 本文原创,转载请注明出处

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • https通信过程的简单理解

    A. client 连接请求发送到server, server根据配置,发送自己相应的证书给客户端的应用程序(通常是浏览器),这时候的证书中含有的信息包括:证...

    qsjs
  • Linux中find命令的点滴积累

    find 命令在Linux中的作用非常强大,对于初学者来说,可能有很多的参数并不能很熟练的使用,导致无法充分发挥find的强大作用;本文对部分参数做初步的探索:

    qsjs
  • shell中一维数组学习

    在shell中也是支持数组的,这里只介绍一维数组的简单使用; 数组的赋值方式: arry=(a b c d) , 每个元素之间用空格分割,所有元素用小括号...

    qsjs
  • Linux中的用户、组和权限管理

    版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/...

    魏晓蕾
  • 数据科学研究院第四届“院长接待日”成功举办

    为给学生提供和院长面对面交流的机会,清华-青岛数据科学研究院(以下简称:数据院)院长接待日于2018年12月18日成功举办。数据院院长俞士纶出席了这场别开生面的...

    数据派THU
  • playbook管理配置文件

    上一篇文章中我们成功的通过playbook安装了nginx,而生产环境中大多时候是需要管理配置文件的,例如修改配置文件然后进行重启服务,修改配置文件时可能会出现...

    端碗吹水
  • python比较两个文件的差异

    使用python脚本比较两个文件的差异内容并输出到html文档中,可以通过浏览器打开查看。

    py3study
  • (3.9)James Stewart Calculus 5th Edition:Hyperbolic Functions

    dodo_lihao
  • 从项目实际问题引发的思考

    现在有一个 Web 项目,前端是使用 Vue.js 开发的,整个前端需要部署到 K8S 上,后端和前端分开,同样也需要部署到 K8S 上,因此二者需要打包为 D...

    崔庆才
  • 【腾讯云的1001种玩法】hadoop 伪分布式搭建

    Hadoop实现了一个分布式文件系统(简称HDFS)。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high...

    张泽旭

扫码关注云+社区

领取腾讯云代金券