codetc - 网站开发技术 首页 后端 服务器 查看内容

Nginx使用自签名SSL证书配置HTTPS

2018-12-22 12:43| 发布者: CODETC| 查看: 2889| 评论: 0

HTTPS也就是让HTTP连接建立在SSL安全连接之上,要保证Web浏览器到服务器的安全连接,HTTPS几乎是唯一选择。

SSL使用证书来创建安全连接,主要有两种验证模式:

  1. 仅客户端验证服务器的证书,客户端自己不提供证书。
  2. 客户端和服务器都互相验证对方的证书。

显然第二种方式安全性更高,普通的Web网站我们只能采用第一种方式,第二种方式一般用网上银行才会这么搞。

那么客户端如何验证服务器的证书呢?

服务器自己的证书必须经过某“权威”证书的签名,而这个“权威”证书又可能经过更权威的证书签名,这么一级一级追溯上去,最顶层那个最权威的证书就称为根证书。
根证书直接内置在浏览器中,这样,浏览器就可以利用自己自带的根证书去验证某个服务器的证书是否有效。

如果要提供一个有效的证书,服务器的证书必须从VeriSign这样的证书颁发机构签名,这样,浏览器就可以验证通过,否则,浏览器给出一个证书无效的警告。

申请一个证书签名的费用是一年几十~几百刀不等,所以如果只是出于管理目的,可以创建自签名证书,保证管理员通过浏览器安全连接到服务器。

下面简单介绍如何创建一个自签名的SSL证书。

创建自签名证书需要安装openssl,使用以下步骤:

  1. 创建Key;
  2. 创建签名请求;
  3. 将Key的口令移除;
  4. 用Key签名证书。

为HTTPS准备的证书需要注意,创建的签名请求的CN必须与域名完全一致,否则无法通过浏览器验证。

以上步骤命令繁琐,所以我做了一个shell脚本,能一次性把证书搞定。

#!/bin/sh

# create self-signed server certificate:

read -p "Enter your domain [www.example.com]: " DOMAIN

echo "Create server key..."

openssl genrsa -des3 -out $DOMAIN.key 1024

echo "Create server certificate signing request..."

SUBJECT="/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=$DOMAIN"

openssl req -new -subj $SUBJECT -key $DOMAIN.key -out $DOMAIN.csr

echo "Remove password..."

mv $DOMAIN.key $DOMAIN.origin.key
openssl rsa -in $DOMAIN.origin.key -out $DOMAIN.key

echo "Sign SSL certificate..."

openssl x509 -req -days 3650 -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crt

echo "TODO:"
echo "Copy $DOMAIN.crt to /etc/nginx/ssl/$DOMAIN.crt"
echo "Copy $DOMAIN.key to /etc/nginx/ssl/$DOMAIN.key"
echo "Add configuration in nginx:"
echo "server {"
echo "    ..."
echo "    listen 443 ssl;"
echo "    ssl_certificate     /etc/nginx/ssl/$DOMAIN.crt;"
echo "    ssl_certificate_key /etc/nginx/ssl/$DOMAIN.key;"
echo "}"

运行上面的脚本,假设你的域名是www.codetc.com,那么按照提示输入:

$ ./gencert.sh 
Enter your domain [www.example.com]: www.codetc.com          
Create server key...
Generating RSA private key, 1024 bit long modulus
.................++++++
.....++++++
e is 65537 (0x10001)
Enter pass phrase for www.codetc.com.key:输入口令
Verifying - Enter pass phrase for www.codetc.com.key:输入口令
Create server certificate signing request...
Enter pass phrase for www.codetc.com.key:输入口令
Remove password...
Enter pass phrase for www.codetc.com.origin.key:输入口令
writing RSA key
Sign SSL certificate...
Signature ok
subject=/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=www.codetc.com
Getting Private key
TODO:
Copy www.test.com.crt to /etc/nginx/ssl/www.codetc.com.crt
Copy www.test.com.key to /etc/nginx/ssl/www.codetc.com.key
Add configuration in nginx:
server {
    ...
    ssl on;
    ssl_certificate     /etc/nginx/ssl/www.codetc.com.crt;
    ssl_certificate_key /etc/nginx/ssl/www.codetc.com.key;
}

注意:证书生成过程中4次要求输入的口令必须都是一样的。

上述步骤完成后,在当前目录下会创建出4个文件:

www.codetc.com.crt:自签名的证书
www.codetc.com.csr:证书的请求
www.codetc.com.key:不带口令的Key
www.codetc.com.origin.key:带口令的Key
Web服务器需要把www.codetc.com.crt发给浏览器验证,然后用www.codetc.com.key解密浏览器发送的数据,剩下两个文件不需要上传到Web服务器上。

Nginx配置ssl证书

server {
    ...
    ssl on;
    ssl_certificate     /etc/nginx/ssl/www.codetc.com.crt;
    ssl_certificate_key /etc/nginx/ssl/www.codetc.com.key;
}

一切顺利配置完成后,打开浏览器,就可以通过HTTPS访问网站了。由于我们的自签名证书不被浏览器信任,第一次访问时会出现警告,把证书通过浏览器导入到系统(Windows使用IE导入,Mac使用Safari导入)并设置为“受信任”,以后该电脑访问网站就可以安全地连接Web服务器了。
文章来源 CODETC,欢迎分享,转载请注明地址: http://www.codetc.com/article-354-1.html

最新评论

 作为游客发表评论,请输入您的昵称

返回顶部