花了几天时间, 看了好多篇博客, 终于搞定了网站的 HTTPS 服务, 借此写篇博客, 来让有需要的朋友少走弯路
一环境介绍
1Linux 下在 Docker 容器中部署好了一个网站, 该网站需要通过外部提供程序访问微软的登录平台, 利用的是 OAuth2.0 协议, 因此要求必须要使用 SSL 服务, 也使得网站必须要加入 HTTPS 服务
2 容器外, 宿主机上通过 jexus 做端口转发 (本没打算用到 jexus, 但是看到情形不对, 还是必须把它拉入进来)
3HTTPS 服务需要证书, 通过在腾讯云上申请免费证书 https://console.cloud.tencent.com/ssl, 一天之内便可申请到, 注意了!!!, 假如说使用的和我一样也是用的 jexus, 而腾讯云提供的证书下载包里面没有 jexus, 只有 IISNginxApache.. 等等,
我们是可以直接利用 Nginx 的两个文件第一个是 crt 文件, 第二个是 key 文件
假如说你需要 pfx 结尾的文件那么可以通过这两个文件进行合成生成 pfx 文件可以通过命令:
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt
将其中文件名更改为你的文件名即可又或者度娘上也有将内容粘贴进去然后自动生成的网站, 不要敲命令的, 这就不再提供网站了
二全配置
首先, 我想说下, 我在 jexus 中配置了 HTTPS 服务, 在 Docker 容器中运行的网站中也配置好了 HTTPS 服务如同此图:
可能有人会想, 为什么都要配置, 只配置 jexus 就足够了啊当然, 配置 jexus 是足够了, 但是我的网站里面如果需要调用比如 OAuth2.0 协议支持的网站时, 回掉地址总是会是用的 HTTP 协议, 开发环境下没问题, 但是一旦弄上域名或是 IP 地址访问, 那么生成的就是 HTTP 的协议了
具体就是在此处. 我通过配置好了微软的外部提供程序, 当点击按钮后将跳转到微软登录页面:
跳转后, 当前登录页面的 url 中写明了一些参数是我们想要的, 比如 redirect_url, 此时我已经配置好了网站上的 HTTPS 协议, 在没有配上时, 该处的 redirect_url 一直都是 HTTP 的
好了, 开始配置 HTTPS 服务:
1 在. Net Core 中配置 HTTPS 协议
首先, 这里可能要搞清楚一下, jexus 和网站之间的请求转发, 这也是我想弄清楚的一个问题, jexus 端口转发请求的时候是不是还是 HTTPS 协议的, 还是说只是请求转发, 到了网站中又变成了 HTTP 了就如这个模型, 在 jexus 转发之后, 进入 kestrel 后是 HTTP 协议的还是 HTTPS 协议的? 希望各位博友帮忙, 我没有找到参考资料
我能做的就是在我尝试在 kestrel 中不配置 HTTPS 协议下, 访问网站虽然也是能够成功的, 但是当通过微软的第三方登录成功后回调地址访问网站时, 便会是使用的 HTTP 协议, 也就会出问题, 与 OAuth 要求使用 SSL 的服务必须使用 HTTPS 协议相矛盾, 也就促使着我必须要在 kestrel 中配置好 HTTPS 协议具体配置如下:
在 Program.cs 文件中, 加入前面所合成的 pfx 文件, 即可, 这种情形下, 要求我的每一个容器中的运行的网站都需要使用证书了同时注意, 在此处不能够使用. UseUrls("https:"//:443") 来设置 HTTPS 服务, 在没有配置. UseKestrel() 下是会报错的, 望注意!
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Threading.Tasks;
- using Microsoft.AspNetCore;
- using Microsoft.AspNetCore.Hosting;
- using Microsoft.Extensions.Configuration;
- using Microsoft.Extensions.Logging;
- using Microsoft.AspNetCore.Server.Kestrel.Core;
- using System.Security.Cryptography.X509Certificates;
- using System.Net;
- using Identity.Api.web.Core;
- namespace Identity.Api
- {
- public class Program
- {
- public static void Main(string[] args)
- {
- BuildWebHost(args).Run();
- }
- public static IWebHost BuildWebHost(string[] args) =>
- WebHost.CreateDefaultBuilder(args)
- //.UseJexusIntegration()
- .UseKestrel(options =>
- {
- options.Listen(IPAddress.Any, 1101, listenOptions =>
- {
- var certificate = new X509Certificate2("hdshopserver.pfx", "你的证书密码");
- listenOptions.UseHttps(certificate);
- });
- })
- .UseStartup<Startup>()
- .Build();
- }
- }
2 在 jexus 上配置 HTTPS 协议 (假如说用的不是 jexus 或是没有用到 jexus, 则可跳过此处)
首先, 通过命令查看到我的 jexus 版本是 5.8.3, 是支持 HTTPS 的了
进入你的 jexus 配置文件夹, 我用图形表示更加直观点:
具体的 jexus 的各种文件功能不再介绍, 此处只针对配置证书服务, 需要查看可看 http://blog.csdn.net/yang1982_0907/article/details/45155765
我们可以在 jws.conf 中配置整个服务器上的所有网站都令其使用 HTTPS 服务:
也可在 siteconf 中配置你需要的单独的网站中使用 HTTPS 服务:
通过 UseHttps=true 和配置好前面所提到的两个文件, jexus 的 HTTPS 服务算是搞定了. 然后可以通过 https:// 域名进行查看, 假如说不能成功, 可以在 jexus 文件夹下的 log 文件中查看信息, 这很关键!!
在 jexus 的配置上还需要感谢 @无语 1994 的帮助, 刚配置时, 用的是自己在服务器上通过命令生成的证书, 不管怎样, 都不能看到到网站页面, 然后通过使用腾讯云上的证书, 摆平!
通过两次配置后我的网站便可使用 HTTPS 服务了, 也因此, 在使用微软的外部提供程序上登录微软第三方页面也就没问题了, 可以正常回调显示了
如想查看, 可以访问 https://www.hdshop.xyz:1101 / 通过登录按钮调用微软登录页面
三个人总结
在配置方面, 走了不少弯路, 首先是只是想到在网站中进行配置, 但是尝试起来发现, 当我将 jexus 关闭后 sh /usr/jexus/jws stop, 也就是直接将网站面向外网, 可以进行访问成功
此时, 每个容器中的网站都各自配置了 HTTPS 服务, 但是想到这里便会感觉每个网站都配置的话, 有点冗余, 那么直接在 jexus 上配置呢当然可以,
通过在 jexus 上配置完毕, 去掉每个网站上各自配置的 HTTPS 服务, 假如说一个网站不需要使用到诸如 OAuth 微信支付等等要求安全性比较高的, 那么 jexus 上配置 HTTPS 服务也就足够了, 但是在使用到那些安全性要求后, 自身网站也要配置起 HTTPS 服务也就因此, 我被困了好多天, 最终的效果是:
四留下问题求助
第一个问题便是在之前提到的那张图中:
jexus 和 kestrel 之间仍然是以什么方式进行传递, 我看到是利用的 tcp, 但是举个例子, 用户访问的 URL 是 https://xxx.com 进入 jexus, 服务转交到 kestrel, 在 kestrel 中接收的是 https://xxx.com 还是 http://xxx.com, 还是说其他的方式
第二个问题便是在配置过程中, 看到微软提供的 HTTP 重定向到 HTTPS 的解决方案, 意思是说我通过 http 访问后会将 http 的访问请求转变成 https 的访问请求吗? 也就是说支持 http 和 https 的两种方式, 是否?
来源: https://www.cnblogs.com/CKExp/p/8469831.html