zoukankan      html  css  js  c++  java
  • 【HTTPS】自签CA证书 && nginx配置https服务

      首先,搭建https服务肯定需要一个https证书。这个证书可以看做是一个应用层面的证书。之所以这么说是因为https证书是基于CA证书生成的。对于正式的网站,CA证书需要到有资质的第三方证书颁发机构去申请获取。对于我们自建的一些小项目,可以使用自己的服务器自签CA证书。这类证书构建出来的HTTPS服务在访问的时候浏览器会发出不可信任的警告,对于自身项目无视即可。

      参考文:【https://blog.csdn.net/xizaihui/article/details/53178897】

    ■  自签CA证书

      以下命令(包括自签CA证书以及HTTPS证书签名的所有命令)都可在同一个目录下完成。

      1. 生成CA私钥

      # openssl genrsa -des3 -out ca.key 2048

      此命令应该会要求你输入一个ca.key对应的加密密码。输入后密码需要记下来后面还要用。

      2. 生成不加密的CA私钥(可不做)

      # openssl genrsa -out ca_decrypted.key 2048

      3. 生成CA公钥即CA根证书

      # openssl req -new -x509 -days 3650 -key ca.key -out ca.crt

      输入命令后应该会需要你输入一些证书相关的周边信息。比如证书颁发机构所在地址,机构名称等等。这里可以都直接回车不填,唯一需要注意的是Common Name那一栏。为了后面操作顺利,按照我现有的实践将这里填写主机名或者主机IP

    ■  生成HTTPS证书并且用CA证书签名

      在生成HTTPS证书的时候需要明确主机名或者主机IP,也就是上面生成CA根证书时输入的那玩意儿。

      1. 生成HTTPS证书私钥

      # openssl genrsa -des3 -out xxxx.pem 1024

      这里的xxxx指的就是上面说的主机名或者主机IP。下面类似不重复说明了

      2. 生成不加密的https主机证书私钥(可不做)

      # openssl rsa -in xxxx.pem -out xxxx.key

      3. 生成签名请求

      # openssl req -new -key xxxx.pem -out xxxx.csr

      4. 用CA进行签名

      # openssl ca -policy policy_anything -days 3650 -cert ca.crt -keyfile ca.key -in xxxx.csr -out xxxx.crt

      其中,policy参数允许签名的CA和网站证书可以有不同的国家、地名等信息,days参数则是签名时限。

      在签名的时候很可能会碰到

      I am unable to access the /etc/pki/CA/newcerts directory
      /etc/pki/CA/newcerts: Permission denied

      的错误。这主要是因为当前执行签名的用户不是root而openssl默认需要将CA相关的一些信息文件放到/etc/pki/CA这个root权限的目录下。要解决这个问题,可以用root用户修改/etc/pki/tls/openssl.cnf文件中的dir配置项。这个配置默认值是/etc/pki/CA,只要改成./CA即可。

      然后还要回到之前在生成https证书的目录下,进行如下操作

      # mkdir -p CA/newcerts

      # touch CA/index.txt

      # echo '01' > CA/serial

      之后再次运行刚才CA签名的命令。

    ■  配置nginx

      在nginx的server配置块中(或者新建一个server配置块)修改或新增如下:

    listen 443;
    ssl on;
    ssl_certificate /path/to/xxxx.crt;
    ssl_certificate_key /path/to/xxxx.key;
    keepalive_timeout 70;

      最后一项据说是优化项,可加可不加。

      还有两个优化项可以加入到http{}配置块中:

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

      修改完成之后可以使用nginx -t命令检查配置文件格式是否正确。

      如果报错说unknown directive ssl什么的话,主要是因为nginx当时编译安装的时候没有将ssl部分的模块编译装进去。解决的办法是找到当时nginx源码包的目录(或者新下载一个也行)

      进入后./configure --with-http_ssl_module重新编译,然后make。注意不要make install,,此时如果make install会把当前nginx以及相关配置文件都覆盖掉!

      然后将源码包目录下的objs/nginx可执行文件替换系统中目前的nginx可执行文件。(注意备份)

      之后在nginx -t应该就可以了。

    ■  之后……

      在将HTTP项目升级部署为HTTPS项目之后,可能会发生一些需要调试的东西。比如说可能原先在页面上要访问同服务器其他端口的HTTP服务,此时如果本服务已经变成了HTTPS了的话,那么会报错无法进行访问。此时就有必要对对方服务进行HTTPS升级。

      如果需要本项目同时可以被HTTP和HTTPS两种协议访问,那么可以尝试修改nginx配置,将server配置块中的listen加上诸如listen 80; listen 443 ssl on;这样的配置。具体不展开了,网上也有很多相关的资料。

  • 相关阅读:
    javascript清空数组的三种方法
    assigning to rvalue错误的原因与解决方法
    form表单提交的disabled属性踩坑记录(某个字段死活保存不上)
    java对两个字符串数组取交集、并集和差集
    vue2.x学习笔记(三十二)
    vue2.x学习笔记(三十)
    vue2.x学习笔记(二十九)
    vue2.x学习笔记(二十八)
    数据结构与算法之间的关系
    记一次解决CSS定位bug思路
  • 原文地址:https://www.cnblogs.com/franknihao/p/9205670.html
Copyright © 2011-2022 走看看