自行颁布ssh证书,实现nginx支持HTTPS
默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译时指定–with-http_ssl_module参数,安装模块依赖于OpenSSL库和一些引用文件,通常这些文件并不在同一个软件包中。通常这个文件名类似libssl-dev。

1、生成证书
可以通过以下步骤生成一个简单的证书:
首先,进入你想创建证书和私钥的目录,例如:
$ mkdir -p /etc/nginx/ssh/
$ cd /etc/nginx/ssh/
# 生成一个RSA密钥
$ openssl genrsa -des3 -out your-domain.key 1024
Enter pass phrase for domain.com.key:设置密码
# 拷贝一个不需要输入密码的密钥文件
$ openssl rsa -in your-domain.key -out your-domain_nopass.key
Enter pass phrase for domain.com.key:输入密码
# 生成一个证书请求
$ openssl req -new -key your-domain.key -out your-domain.csr
Enter pass phrase for domain.com.key:输入密码

# 自己签发证书
$ openssl x509 -sha256 -req -days 365 -in your-domain.csr -signkey your-domain.key -out your-domain.crt
Enter pass phrase for domain.com.key:输入密码
第3个命令是生成证书请求,会提示输入省份、城市、域名信息等,重要的是,email一定要是你的域名后缀的;或不填,直接回车。
这样就有一个 csr 文件了,提交给 ssl 提供商的时候就是这个 csr 文件。当然我这里并没有向证书提供商申请,而是在第4步自己签发了证书。
整个流程图片:

编辑配置文件nginx.conf,给站点加上HTTPS协议
server {
server_name YOUR_DOMAINNAME_HERE;
listen 443;
ssl on;
ssl_certificate /etc/nginx/ssh/your-domain.crt;
ssl_certificate_key /etc/nginx/ssh/your-domain_nopass.key;
}
若ssl_certificate_key 使用your-domain.key,则每次启动Nginx服务器都要求输入key的密码。
重启Nginx后即可通过https访问网站了。
自行颁发的SSL证书能够实现加密传输功能,但浏览器并不信任,会出现以下提示:
2、受浏览器信任的证书
要获取受浏览器信任的证书,则需要到证书提供商处申请。证书授证中心,又叫做CA机构,为每个使用公开密钥的用户发放一个数字证书。浏览器在默认情况下内置了一些CA机构的证书,使得这些机构颁发的证书受到信任。VeriSign即是一个著名的国外CA机构,工行、建行、招行、支付宝、财付通等网站均使用VeriSign的证书,而网易邮箱等非金融网站采用的是中国互联网信息中心 CNNIC颁发的SSL证书。一般来说,一个证书的价格不菲,以VeriSign的证书为例,价格在每年8000元人民币左右。
据说也有免费的证书可以申请。和VeriSign一样,StartSSL 也是一家CA机构,它的根证书很久之前就被一些具有开源背景的浏览器支持(Firefox浏览器、谷歌Chrome浏览器、苹果Safari浏览器等)。后 来StartSSL竟然搞定了微软:在升级补丁中,微软更新了通过Windows根证书认证(Windows Root Certificate Program)的厂商清单,并首次将StartCom公司列入了该认证清单。现在,在Windows 7或安装了升级补丁的Windows Vista或Windows XP操作系统中,系统会完全信任由StartCom这类免费数字认证机构认证的数字证书,从而使StartSSL也得到了IE浏览器的支持。
3、只针对注册、登陆进行https加密处理
既然HTTPS能保证安全,为什么全世界大部分网站都仍旧在使用HTTP呢?使用HTTPS协议,对服务器来说是很大的负载开销。从性能上考虑,我 们无法做到对于每个用户的每个访问请求都进行安全加密(当然,Google这种大神除外)。作为一个普通网站,我们所追求的只是在进行交易、密码登陆等操 作时的安全。通过配置Nginx服务器,可以使用rewrite来做到这一点。
在https server下加入如下配置:
if ($uri !~* "/logging.php$")
{
rewrite ^/(.*)$ http://$host/$1 redirect;
}
在http server下加入如下配置:
if ($uri ~* "/logging.php$")
{
rewrite ^/(.*)$ https://$host/$1 redirect;
}
这样一来,用户会且只会在访问logging.php的情况下,才会通过https访问。
更新:有一些开发框架会根据 $_SERVER['HTTPS'] 这个 PHP 变量是否为 on 来判断当前的访问请求是否是使用 https。为此我们需要在 Nginx 配置文件中添加一句来设置这个变量。遇到 https 链接重定向后会自动跳到 http 问题的同学可以参考一下。
server {
...
listen 443;
location \.php$ {
...
include fastcgi_params;
fastcgi_param HTTPS on; # 多加这一句
}
}
server {
...
listen 80;
location \.php$ {
...
include fastcgi_params;
}
}
相关推荐
-
如何高效实现elasticsearch和mysql 的数据同步
如何高效实现elasticsearch和mysql 的数据同步2025-04-29 01:57:31 -
记录日常学习——PHP之运算符2025-04-29 01:26:52
-
NGINX快速入门 Nginx性能参数调优2025-04-29 00:35:34
-
MySQL如何实现双机热备份2025-04-29 00:22:37
-
自行颁布ssh证书,实现nginx支持HTTPS2025-04-29 00:18:08