nginx怎么配置ssl可以即允许http访问也允许https访问

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx怎么配置ssl可以即允许http访问也允许https访问相关的知识,希望对你有一定的参考价值。

由于自己生成的证书不受浏览器信任,所以需要到第三方ssl证书提供商处购买,在购买ssl证书时,需要提供一个自己的web服务器生成的csr密码。
生成csr的步骤:
①:生成RSA密钥:
[plain] view plain copy
$openssl genrsa -out privkey.pem 2048
注意,有的证书是要 1024 的,所以得:
[plain] view plain copy
openssl genrsa -out privkey.pem 1024
②:生成csr证书:
[plain] view plain copy
openssl req -new -key privkey.pem -out cert.csr
会提示输入省份、城市、域名信息等,重要的是,email 一定要是你的域名后缀的,比如 webmaster@zou.lu 并且能接受邮件,因为ssl证书提供商会发送验证邮件和证书文件压缩包到这个邮箱。
这样就有一个 csr 文件了,直接vi ./cert.csr 查看证书的内容,是一串字符串,如下:
[plain] view plain copy
-----BEGIN CERTIFICATE REQUEST-----
MIIBsTCCARoCAQAwcTELMAkGA1UEBhMCQ04xCzAJBgNVBAgTAkhCMQwwCgYDVQQH
EwNTSloxDzANBgNVBAoTBkZhbmZvdTESMBAGA1UEAxMJZzFuZm91LmRlMSIwIAYJ
KoZIhvcNAQkBFhN3ZWJtYXN0ZXJAZmFuZm91LmRlMIGfMA0GCSqGSIb3DQEBAQUA
A4GNADCBiQKBgQC5l4PmZg6TCIpduefxq5gsLXN1JeQdBmUs+pEApeHmNoxE+R4k
VkQUJzLj5o3ltQGJzYrcIfru8NryQSxaT/5IjeFwS7nIMsx8KPkQQ71BJazsiZj+
CdLDRJj1m/SrjTsNrfYj4rFFS1FXq7uEDyreUx7fyAljx70jPSsGBOGwRQIDAQAB
oAAwDQYJKoZIhvcNAQEFBQADgYEACKCBQcnCq5yE3GFyN3NyxCQEvnspkIv9AqI4
FcwqyHPZWkupp3wfubHY80IwtfjlGlTSynzE7FZLVpcbNfKLnAYlYEwDY7NukJNy
pCbyqpJJXdAl3Jcun0NlLtSxTQpR+abO8va/BAO5Hp9h1rpSRtTdSJd2fC/owRV1
BfRuJnA=
-----END CERTIFICATE REQUEST-----
直接复制上面的字符串提交给ssl证书提供商,提供商处理后会发送ssl相关证书到webmaster@zou.lu邮箱,如下:

把所有文件全部上传到一个特定的目录,比如我是上传到 /usr/local/nginx/conf。
这里,zoulukey.pem 和 zoulucert.csr 是自己原来在web服务器生成的,剩下的都是证书签发机构颁发的。
一般情况下,直接用证书签发机构颁发的 crt 文件即可,比如 zou_lu.crt ,但是有很多证书签发机构默认在 Firefox 中文版下是不会信任的,经过仔细研究,终于发现,原来得把证书签发机构给你的 crt 文件也放入才行,这时需要合并 PositiveSSLCA.crt (证书签发机构的 crt)和zou_lu.crt (自己域名的 crt),方法如下:
[plain] view plain copy
cat zou_lu.crt >> PositiveSSLCA.crt
mv PositiveSSLCA.crt zou_lu.crt
或者直接用记事本打开,然后复制 PositiveSSLCA.crt 里面所有的内容到 zou_lu.crt 最下方即可。
上传证书完成后,需要修改nginx的配置,因为并不需要整站https访问,所以需要http和https访问共存,如下:
[plain] view plain copy
server
listen 80;
listen 443 ssl;
server_name zou.lu;
root /var/www/html;

#ssl on; //这行必须要注释掉
ssl_certificate /usr/local/nginx/conf/zou_lu.crt;
ssl_certificate_key /usr/local/nginx/conf/zoulukey.pem;

配置完成,现在试着用http和https访问同一个链接,应该都可以访问了。
参考技术A 同时开启80端口和443端口,http和https都可以访问,你可以通过设置301重定向来使http自动跳转到https,用户输入http也可以访问到网站。参考nginx配置ssl证书教程https://www.wosign.com/Docdownload/index.htm本回答被提问者采纳 参考技术B nginx环境配置中,不配置301跳转就可以了。

nginx https配置多域名共享SSL证书禁止ip访问http强转https

nginx https配置

server 
    listen              443 ssl;
    server_name         www.example.com;
    ssl_certificate     www.example.com.crt;
    ssl_certificate_key www.example.com.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ...

按照nginx官方文档所说,要支持https,只需要配置listenssl_certificatessl_certificate_key 三项,ssl_certificate是公钥,通常称为公钥证书,客户端请求建立连接时服务端会将公钥发送给客户端,ssl_certificate_key 是私钥,需要保密,私钥存在服务器端,建立连接时,不会发送到客户端;ssl_protocolsssl_ciphers可以不指定,使用默认值即可。

nginx单ip多域名共享SSL证书

Https证书的SubjectAltName字段可以准确指定适配域名,比如a.domain.comb.domain.com,但有长度限制;SubjectAltName字段还可以指定通配符域名,比如*.domain.com,它只能覆盖一级,a.domain.com,b.doamin.com,但不能覆盖domain.com;通常可以将这两种使用方式结合起来,比如domain.com*.domain.com
单ip多域名情况,应该如何配置证书呢?
答案是在http块中配置SSL,这样server块会继承http中的ssl证书配置,SSL证书只占一块内存,与各个server中配置相比能节省内存。

http
    ssl_certificate     common.crt;
    ssl_certificate_key common.key;

    server 
        listen          443 ssl;
        server_name     www.example.com;
        ...
    

    server 
        listen          443 ssl;
        server_name     www.example.org;
        ...
    

查看证书内容

也许你会好奇,应该怎么查看SSL证书的域名信息呢?拿百度为例。
点击地址栏的锁---->连接是安全的---->证书有效---->详细信息---->使用者可选名称


可以看到,证书适配*.baidu.combaidu.com,还有个常见需求查看证书有效期

当然也可以通过命令查看证书内容,那就要用到openssl了,windows安装openssl,选择Win64 OpenSSL v3.0.3 Light版本,这也是官方推荐的版本。

查看证书内容
先将证书导出
点击地址栏的锁---->连接是安全的---->证书有效---->详细信息---->复制到文件----->

勾选base64编码

openssl x509 -in my.cer -noout -text

查看证书链

有时同一个https网站,有的浏览器正常,有的浏览器告警,这大概率是证书签发机构是中间商,不在浏览器的基础签发库里导致,可以将中间商一直到root的签发机构串起来,
cat www.example.com.crt bundle.crt > www.example.com.chained.crt,注意www.example.com.crt要在前边;
查看证书链命令:

openssl s_client -connect www.baidu.com:443

nginx http强转https

  server
    listen 80;
    return 301 https://$host$request_uri;
  
  • $host 依次从请求url中、request header的Host中、匹配的server_name中获取;
  • $request_uri会包含全部参数的原始请求uri

nginx 禁止ip访问

  server
     listen 80 ;
     listen 443 ssl;
     server_name 指定ip;
     return 403;
  

以上是关于nginx怎么配置ssl可以即允许http访问也允许https访问的主要内容,如果未能解决你的问题,请参考以下文章

nginx怎么配置ssl可以即允许http访问也允许https访问

nginx怎么配置ssl可以即允许http访问也允许https访问

nginx配置ssl证书,允许ssl访问

怎么使用Nginx配置ssl实现https访问的方法

linux nginx ssl证书怎么配置

Nginx的加载失败的SSL证书问题,怎么解决