使用openssl自签发证书,nginx反向代理https请求

我们需要证书时,有两种方式获得,一种是向CA证书颁发机构申请,另一种就是自己做CA证书颁发机构,自己给颁发证书。

向CA证书颁发机构申请证书

需要先生成“证书请求”文件(后缀大多为.csr),这个文件中包含你的名字和公钥。然后将此证书请求文件交给诸如verisign等提供CA服务的公司(当然要连同几百美元)。证书请求经验证后,CA机构用它的私钥签名,形成合法的证书发给你。你在web服务器上导入这个证书就行了。为啥它们颁发的证书才是合法的,因为浏览器和操作系统已经把这些CA根证书预置到了电脑里,所以浏览器认为使用了这些CA机构颁发的证书的网站是安全的,地址栏上有个小锁标志。

自颁发证书

在组织内网使用,为节省费用,组织一般自己做CA,自己给自己颁发证书。为了让组织内的电脑认为自颁发的证书是合法的,就需要把这个CA根证书内植入组织内的每台电脑中,告诉电脑这个CA是受信任的颁发机构。基本步骤为:先配置CA的私钥和公钥,私钥保存,自签CA,公钥可以公开。当组织内需要证书时,将生成证书请求提交给组织的CA进行签发。

这里讲一下如何自签发证书:

一、知识介绍

介绍两种常见加密算法

  1. AES 对称加密
    加密和解密使用同一个密钥。

    优点:加密快、方便;

    缺点:密钥容易被偷,或被破解。

    常见的对称加密算法还有:DES、3DES、Blowfish、RC2以及国密的SM4。
  2. RSA 非对称加密
    密钥分为两个:公钥和私钥。公钥发给对方,可以公开,私钥自己保管。用公钥加密的数据只能用私钥打开 。

    常见的非对称加密算法还有:Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)以及国家商用密码SM2算法。

两种证书编码

  1. der
    二进制der编码的证书,这些证书也可以用.cer或.crt作为扩展名。
    比较合适的说法是“我有一个DER编码的证书”,而不是“我有一个DER证书”。
  2. .PEM
    X.509 v3 证书。文件内容由"—– BEGIN …“开始的ASCII(Base64)数据。

常见几种扩展名文件

  1. .key:私钥。可以是DER编码或者PEM编码。通常是rsa算法。
  2. .csr :证书请求文件,用于申请证书。
  3. .crt:证书文件。可以是DER编码,也可以是PEM编码。
  4. .cer:crt证书的微软形式。可以用微软的工具把crt文件转换为cer文件(crt和cer必须是相同编码类型,要么是der,要么是pem)
  5. .pem:证书文件。也代表证书的编码类型。

 

windows版的OpenSSL,下载地址:http://slproweb.com/products/Win64OpenSSL.html,安装完openssl后,添加系统环境变量C:\OpenSSL-Win64\bin。

MAC系统自带OpenSSL,不需要再安装。

 

二、实例

使用openssl自签发一个CA根证书,然后用这个根证书签发一个通配符证书,以下为操作步骤:

注意:openssl命令中,多一个空格,少一个空格都会造成命令出错。参数的短横线也要注意。

第一步 生成根证书

1、生成根证书私钥

生成无密码的私钥:

先在用户目录下建立一个ssl目录,用来存放生成的文件

openssl genrsa -out ssl/ca.key 2048

2、生成证书请求文件

据私钥生成证书请求文件

openssl req -new -key ssl/ca.key -out ssl/ca.csr

会提示输入以下内容:

假设你的域名为123.com,除了Commn name要和你的域名有关以外,其它随便输入即可。

国家(CN)、地区(BJ)、组织(helloworld)、部门(ca)、Common name(ca.123.com),email(dd@dd.com)。

3、自签发根证书

openssl x509 -req -days 3650 -sha256 -extensions v3_ca -signkey ssl/ca.key -in ssl/ca.csr -out ssl/ca.crt

至此,~/ssl/目录中应该生成了三个文件:ca.csr、ca.crt、ca.key

第二步 用根证书签发一个通配符证书

1、生成一个证书私钥

openssl genrsa -out ssl/server1.key 2048

注意:生成的文件名是server1.key,而不是server1.key 2048,如果是后者,需要检查一下命令格式(把2048前面的空格,删除,重新输入空格,再执行命令)

2、生成证书请求文件

openssl req -new -key ssl/server1.key -out ssl/server1.csr

这一步中的Common name要写成通配符形式,如*.123.com,这样这个域名的其它子域名都可以用这一个证书了。

3、使用根证书签发这个证书

openssl x509 -req -days 3650 -sha256 -extensions v3_req -CA ssl/ca.crt -CAkey ssl/ca.key -CAserial ca.srl -CAcreateserial -in ssl/server1.csr -out ssl/server1.crt

 

如果需要的是pfx格式(一般windows需要这种格式)的证书,使用以下命令进行合成(需要上面生成的私钥.key文件和服务器证书.crt文件):

openssl pkcs12 -export -out ssl/server1.pfx -inkey ssl/server1.key -in ssl/server1.crt 

 

至此,我们已经使用openssl自签发了一个CA证书,并用CA证书签发了一个通配符证书。下一步,我们把它部署到nginx上。

在~/ssl/目录下,又生成了四个文件:server1.pem、server1.csr、server1.crt、server1.key

nginx反向代理https后端服务器

一般而言,网站与用户之间如果使用了nginx反向代理,只需要在用户访问nginx启用https即可,nginx到web服务器是https还是http不重要。

如果nginx到web服务器之间也需要https通信,则参照以下描述:

  1. 用户通过https访问nignx(这里需要在nginx上部署合法的证书)
  2. nginx通过https反向代理到web服务器(这里用自签发的证书即可)
  3. web服务器启用https(可以是web服务器自身启用https,也可以再架设一台内网nginx服务器,外网nginx到内网nginx启用https,内网nginx到web服务器仍保持http)

在nginx服务器上建立以下目录(建议):

  1. /etc/letsencrypt/live/XXXX.com/
    存放let's encrypt生成的合法的证书:
  2. 以下目录存放自签发的证书:
    /etc/certs/ca.cert
    /etc/certs/*.xxxx.com/*.xxx.com.crt
    /etc/certs/*.xxxx.com/*.xxx.com.key

 

nginx主要配置如下:

server {
        server_name XXXX;
        add_header Strict-Transport-Security "max-age=31536000";
		listen 443 ssl;
      
        ssl_certificate /etc/letsencrypt/live/XXXX.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/XXXX.com/privkey.pem;
        

        location / {
        proxy_pass https://XXXX$request_uri;

        proxy_ssl_certificate    /etc/certs/*.xxxx.com/*.xxxx.com.crt;
        proxy_ssl_certificate_key    /etc/certs/*.xxxx.com/*.xxxx.com.key;
        proxy_ssl_trusted_certificate /etc/certs/ca.crt;
        proxy_ssl_verify        off;

        proxy_ssl_session_reuse on;
     	proxy_ssl_verify_depth  2;
        proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        proxy_ssl_ciphers   HIGH:!aNULL:!MD5;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_pass_header  Set-Cookie;
}

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
   		 

}


附:证书转换命令:

.key 转换成 .pem

openssl rsa -in ssl/ca.key -out ssl/ca.pem

.crt 转换成 .pem

openssl x509 -in ssl/ca.crt -out ssl/ca.pem

倒过来转换:

.pem转换成.key

openssl rsa -in ssl/ca.pem -out ssl/ca.key

.pem转换成.crt

openssl x509 -in ssl/ca.pem -out ssl/ca.crt 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值