如何让网站和API都支持HTTPS?在Nginx上做文章是个好选择!

标签: 网站 api https | 发表时间:2020-10-28 00:54 | 作者:MacroZheng
出处:https://juejin.im/backend?sort=monthly_hottest

SpringBoot实战电商项目mall(40k+star)地址: github.com/macrozheng/…

摘要

随着我们网站用户的增多,我们会逐渐意识到HTTPS加密的重要性。在不修改现有代码的情况下,要从HTTP升级到HTTPS,让Nginx支持HTTPS是个很好的选择。今天我们来讲下如何从Nginx入手,从HTTP升级到HTTPS,同时支持静态网站和SpringBoot应用,希望对大家有所帮助!

生成SSL自签名证书

虽然自签名证书浏览器认为并不是安全的,但是学习下SSL证书的生成还是很有必要的!

  • 首先创建SSL证书私钥,期间需要输入两次用户名和密码,生成文件为 blog.key
   openssl genrsa -des3 -out blog.key 2048
复制代码
  • 利用私钥生成一个不需要输入密码的密钥文件,生成文件为 blog_nopass.key
   openssl rsa -in blog.key -out blog_nopass.key
复制代码
  • 创建SSL证书签名请求文件,生成SSL证书时需要使用到,生成文件为 blog.csr
   openssl req -new -key blog.key -out blog.csr
复制代码
  • 在生成过程中,我们需要输入一些信息,需要注意的是 Common Name需要和网站域名一致;
   Enter pass phrase for blog.key:
-----
Country Name (2 letter code) [XX]:CN                                         # 国家代码
State or Province Name (full name) []:jiangsu                                # 省份
Locality Name (eg, city) [Default City]:jiangsu                              # 城市
Organization Name (eg, company) [Default Company Ltd]:macrozheng             # 机构名称
Organizational Unit Name (eg, section) []:dev                                # 单位名称
Common Name (eg, your name or your server's hostname) []:blog.macrozheng.com # 网站域名
Email Address []:[email protected]                                           # 邮箱

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:                                                     # 私钥保护密码,可以不输入直接回车
An optional company name []:                                                 # 可选公司名称,可以不输入直接回车
复制代码
  • 生成SSL证书,有效期为365天,生成文件为 blog.crt
   openssl x509 -req -days 365 -in blog.csr -signkey blog.key -out blog.crt
复制代码
  • 其实最终有用的文件是两个,一个是证书文件 blog.crt,另一个是不需要输入密码的证书私钥文件 blog_nopass.key

Nginx支持HTTPS

SSL证书生成好了,接下来我们就可以配置Nginx来支持HTTPS了!

安装Nginx

  • 我们还是使用在Docker容器中安装Nginx的方式,先下载Nginx的Docker镜像;
   docker pull nginx:1.10
复制代码
  • 下载完成后先运行一次Nginx,由于之后我们要把宿主机的Nginx配置文件映射到Docker容器中去,运行一次方便我们拷贝默认配置;
   docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx  \
-d nginx:1.10
复制代码
  • 运行成功后将容器中的Nginx配置目录拷贝到宿主机上去;
   docker container cp nginx:/etc/nginx /mydata/nginx/
复制代码
  • 将宿主机上的 nginx目录改名为 conf,要不然 /mydata/nginx/nginx这个配置文件目录看着有点别扭;
   mv /mydata/nginx/nginx /mydata/nginx/conf
复制代码
  • 创建的Nginx容器复制完配置后就没用了,停止并删除容器;
   docker stop nginx
docker rm nginx
复制代码
  • 使用Docker命令重新启动Nginx服务,需要映射好配置文件,由于我们要支持HTTPS,还需要开放 443端口。
   docker run -p 80:80 -p 443:443 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx  \
-v /mydata/nginx/conf:/etc/nginx \
-d nginx:1.10
复制代码

配置支持HTTPS

  • 将我们生成好的SSL证书和私钥拷贝到Nginx的 html/ssl目录下;
   cp blog_nopass.key /mydata/nginx/html/ssl/
cp blog.crt /mydata/nginx/html/ssl/
复制代码
  • 接下来我们需要给 blog.macrozheng.com这个域名添加HTTPS支持,在 /mydata/nginx/conf/conf.d/目录下添加Nginx配置文件 blog.conf,配置文件内容如下;
   server {
    listen       80; # 同时支持HTTP
    listen       443 ssl; # 添加HTTPS支持
    server_name  blog.macrozheng.com;
  
    #SSL配置
    ssl_certificate      /usr/share/nginx/html/ssl/blog/blog.crt; # 配置证书
    ssl_certificate_key  /usr/share/nginx/html/ssl/blog/blog_nopass.key; # 配置证书私钥
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2; # 配置SSL协议版本
    ssl_ciphers          ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # 配置SSL加密算法
    ssl_prefer_server_ciphers  on; # 优先采取服务器算法
    ssl_session_cache    shared:SSL:10m; # 配置共享会话缓存大小
    ssl_session_timeout  10m; # 配置会话超时时间

    location / {
        root   /usr/share/nginx/html/www;
        index  index.html index.htm;
    }

    location /admin {
        alias   /usr/share/nginx/html/admin;
        index  index.html index.htm;
    }

    location /app {
        alias   /usr/share/nginx/html/app;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
复制代码
  • 通过 HTTPS访问 blog.macrozheng.com这个域名,由于我们使用的是自己签名的SSL证书,浏览器会提示 您的连接不是私密连接,点击继续前往可以通过HTTPS正常访问;

  • 我们可以查看下证书的 颁发者信息,可以发现正好是之前我们创建SSL证书签名请求文件时录入的信息;

  • 接下来我们需要给 api.macrozheng.com这个域名添加HTTPS支持,通过这个域名可以使用HTTPS访问我们的SpringBoot应用, api.crtapi_nopass.key文件需要自行生成,在 /mydata/nginx/conf/conf.d/目录下添加Nginx配置文件 api.conf,配置文件内容如下;
   server {
    listen       80; # 同时支持HTTP
    listen       443 ssl; # 添加HTTPS支持
    server_name  api.macrozheng.com; #修改域名

    #ssl配置
    ssl_certificate      /usr/share/nginx/html/ssl/api/api.crt; # 配置证书
    ssl_certificate_key  /usr/share/nginx/html/ssl/api/api_nopass.key; # 配置证书私钥
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2; # 配置SSL协议版本 # 配置SSL加密算法
    ssl_ciphers          ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers  on; # 优先采取服务器算法
    ssl_session_cache    shared:SSL:10m; # 配置共享会话缓存大小
    ssl_session_timeout  10m; # 配置会话超时时间

    location / {
        proxy_pass   http://192.168.3.101:8080; # 设置代理服务访问地址
        proxy_set_header  Host $http_host; # 设置客户端真实的域名(包括端口号)
        proxy_set_header  X-Real-IP  $remote_addr; # 设置客户端真实IP
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; # 设置在多层代理时会包含真实客户端及中间每个代理服务器的IP
        proxy_set_header X-Forwarded-Proto $scheme; # 设置客户端真实的协议(http还是https)
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
复制代码
  • 通过 HTTPS访问 api.macrozheng.com这个域名,访问地址为:https://api.macrozheng.com/swagger-ui.html

  • 任意调用一个接口测试下,比如说登录接口,可以发现已经可以通过HTTPS正常访问SpringBoot应用提供的接口。

使用受信任的证书

之前我们使用的是自签名的SSL证书,对于浏览器来说是无效的。使用权威机构颁发的SSL证书浏览器才会认为是有效的,这里给大家推荐两种申请免费SSL证书的方法,一种是从阿里云申请,另一种是从FreeSSL申请。

阿里云证书

  • 阿里云上可以申请的免费证书目前只有支持单个域名的DV级SSL证书。比如说你有 blog.macrozheng.comapi.macrozheng.com两个二级域名需要使用HTTPS,就需要申请两个SSL证书。

  • 申请成功后点击下载Nginx证书即可;

  • 下载完成后解压会有下面两个文件;
   blog.macrozheng.com.key # 证书私钥文件
blog.macrozheng.com.pem # 证书文件
复制代码
  • 拷贝证书文件到Nginx的指定目录下,然后修改配置文件 blog.conf,只要修改证书配置路径即可,修改完成后重启Nginx;
   #SSL配置
ssl_certificate      /usr/share/nginx/html/ssl/blog/blog.macrozheng.com.pem; # 配置证书
ssl_certificate_key  /usr/share/nginx/html/ssl/blog/blog.macrozheng.com.key; # 配置证书私钥
复制代码
  • 再次通过HTTPS访问 blog.macrozheng.com这个域名,发现证书已经有效了,连接也是安全的了。

FreeSSL证书

  • 如果你有使用通配符域名的需求,可以上 FreeSSL申请SSL证书,不过免费的有效期只有3个月,这就意味着你过3个月就要重新申请一次了。

  • 附上官网地址:https://freessl.cn/

使用 acme.sh自动申请证书

  • acme.sh脚本实现了 acme协议, 可以从 letsencrypt生成免费的证书。一般我们申请的证书有效期都是1年,过期就要重新申请了,使用 acme.sh脚本可以实现到期自动申请,再也不用担心证书过期了!

  • 附上官网地址:https://github.com/acmesh-official/acme.sh

本文 GitHub github.com/macrozheng/… 已经收录,欢迎大家Star!

相关 [网站 api https] 推荐:

如何让网站和API都支持HTTPS?在Nginx上做文章是个好选择!

- - 掘金后端本月最热
SpringBoot实战电商项目mall(40k+star)地址:. 随着我们网站用户的增多,我们会逐渐意识到HTTPS加密的重要性. 在不修改现有代码的情况下,要从HTTP升级到HTTPS,让Nginx支持HTTPS是个很好的选择. 今天我们来讲下如何从Nginx入手,从HTTP升级到HTTPS,同时支持静态网站和SpringBoot应用,希望对大家有所帮助.

salt-api https证书报错解决方法

- - 运维技术的个人空间
问题的原因是“SSL: CERTIFICATE_VERIFY_FAILED”. Python 升级到 2.7.9 之后引入了一个新特性,当使用urllib.urlopen打开一个 https 链接时,会验证一次 SSL 证书. 而当目标网站使用的是自签名的证书时就会抛出一个 urllib2.URLError: 的错误消息,详细信息可以在这里查看(https://www.python.org/dev/peps/pep-0476/).

扒一扒HTTPS网站的内幕

- - SegmentFault 最新的文章
野狗科技运维总监,曾在360、TP-Link从事网络运维相关工作,在网站性能优化、网络协议研究上经验丰富. 今年6月,维基媒体基金会发布公告,旗下所有网站将默认开启HTTPS,这些网站中最为人所知的当然是全球最大的在线百科-维基百科. 而更早时候的3月,百度已经发布公告,百度全站默认开启HTTPS.

搭建微服务器:express+https+api代理 - 馒头加梨子 - 博客园

- -
service worker,但是service worker只能在https下跑,所以查资料自己用纯express搭建了一个微服务器,把过程记录下来,供以后开发时参考,相信对其他人也有用. 首先我们用express搭建一个. http服务器,很简单,看看官方文档就可以搭建出来了. 理想状况是,在项目目录下建立一个server文件夹,然后在server文件夹里面启动服务器,加载项目目录下的dist文件夹.

HTML5 Web Speech API,让网站更有趣

- - SegmentFault 最新的文章
Web API 变得越来越丰富,其中一个值得注意的是 Web Speech API. 传统的网站只能“说”,这个API的出现,让网站能“倾听”用户. 这个功能已经开放了一系列的用法,非常棒. 在这篇文章中,我们将看一下这项技术和建议的用法,以及如何用它来增强用户体验的一些好例子. 声明:本技术比较前沿,目前该规范是W3C的“非官方编辑器的征求意见稿”(截至2014年6月6日).

强制Chrome浏览器Https加密访问网站

- HENG - 启光博客
  强制Chrome浏览器加密访问网站其实也就是强制Chrome浏览器http重定向到https,这种技巧对于经常修改Hosts的网友可能用处较大些. 比如修改Hosts后访问Twitter,多数情况下访问http://www.twitter.com是不能访问的,要输入https://twitter.com才行.

免费SSL证书(https网站)申请 - osfipin - 博客园

- -
如何拥有一个自己的免费的SSL证书,并且能够长期拥有. 这篇文章让你找到可用的免费证书o(* ̄︶ ̄*)o. 各厂商提供的免费SSL基本是Symantec(赛门铁克),申请一年,不支持通配符,有数量限制. 免费数字证书,最多保护一个明细子域名,不支持通配符,一个阿云帐户最多签发20张免费证书. 兼容性如下操作系统版本IOS 5.0+、Android 2.3.3+、JRE 1.6.5+、WIN 7+.

使用 HTTPS 的网站也能被黑客监听到数据吗?

- - 知乎每日精选
刚好这两天想要发布公共号关于这篇文章,“L”告诉你的. 那我就简单的说说(随后同步到公众号和专栏)另外如果有人说有AD或者其他嫌疑,那你就当没看见关闭网页吧,用心去看. 最近波兰CERT一篇名为的文章引起我们的注意,原文地址:( https://www.cert.pl/news/8019/langswitch_lang/en ),报告中写到:“很多家用路由器存在未授权的远程修改配置漏洞导致了这次事件的发生.

家谱社交网站MyHeritage开放家庭图谱API

- pestwave - 36氪
MyHeritage被认为是以色列最有希望的web2.0公司,保持着高速的成长,让竞争对手Geni和Ancestry.com(已经上市)望尘莫及. 这家公司已经拥有接近6千万的注册用户,上传了2千万份家谱、8亿份档案和1.25亿张照片. 这些储备对完成像MyHeritage和Geni这类公司的承诺——发现与你相关的人,非常重要.

https协议

- - 互联网 - ITeye博客
SSL 协议的握手过程   .       为了便于更好的认识和理解 SSL 协议,这里着重介绍 SSL 协议的握手协议. SSL 协议既用到了公钥加密技术(非对称加密)又用到了对称加密技术,SSL对传输内容的加密是采用的对称加密,然后对对称加密的密钥使用公钥进行非对称加密. 这样做的好处是,对称加密技术比公钥加密技术的速度快,可用来加密较大的传输内容,公钥加密技术相对较慢,提供了更好的身份认证技术,可用来加密对称加密过程使用的密钥.