记录搭建一台可域名访问的HTTPS服务器

一、背景

        近期公司业务涉及到微信小程序,即将开发完成需要按照微信小程序平台的要求提供带证书的域名请求服务器。

        资源背景介绍如下:

        1、域名

        公司已有一个二级域名,再次申请新的二级域名并且实现ICP备案不仅需要花重金重新购买,还需要等待备案将近一个月。于是决定借用已有的二级域名将请求绑定到443以外的端口,理想的最终访问形式为:https://erp.aikes.com:8066/xxx/xxx.html(微信小程序也支持该种配置)

        2、证书

        公司的二级域名上已经绑定证书,新部署的服务也需要有SSL证书认证,否则https请求无法通过。有背景一的担保,该服务复用证书亦是可行的。

        3、代理

        为安全起见,新部署的服务不再使用线上正在跑的服务器,仅通过代理将请求转发到新的服务器。我们将微信小程序涉及到的资源文件及后端服务部署到新服务器即可。

二、正文

        正文中将分为几个部分进行操作记录,尽可能完整的复述当时出现的问题已经整改方案

1、代理和证书的纠葛

        关于代理的使用,和同事沟通后初步拟定了两种方案:1、通过Nginx代理;2、通过netsh实现TCP端口转发。

        出于安全性以及独立性考虑,尽可能小的影响线上服务器的情况下选择了Nginx进行代理,完整流程:监听目标端口,配置SSL证书,转发请求到目标服务器。

        以下是Nginx的配置文件 nginx.conf,证书文件放到同级的conf目录即可:

worker_processes 5;

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay    on;

    keepalive_timeout  65;

    client_body_buffer_size 100m;
    client_max_body_size 100m;

    # HTTPS server
    server {
        listen 8066 ssl;
        server_name erp.aikes.com;

        ssl_certificate      cert/erp_aikes_com_integrated.crt;
        ssl_certificate_key  cert/erp_aikes_com.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_pass https://192.168.10.236:8066;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_connect_timeout 60;
            proxy_read_timeout 300;
            proxy_send_timeout 300;
        }
    }
}

        上述转发的配置中,跳转到内网的10.236机器正是我们新申请的服务器,8066端口为Tomcat使用,此处配置为https请求的话,Tomcat中也需要增加SSL证书实现https协议。

        也可以将其配置为http,则Tomcat也不需要增加证书。整个客户端请求的证书认证在Nginx端已经处理完毕。

        以下是新服务器(10.236:8066)上Tomcat增加SSL证书配置 server.xml (核心部分):

    <Connector executor="tomcatThreadPool"
               port="1001" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    
    <Connector port="8066" protocol="org.apache.coyote.http11.Http11Nio2Protocol" maxThreads="150" SSLEnabled="true"
        scheme="https"
        secure="true"
        keystoreFile="conf/erp_aikes_com.jks"
        keystoreType="JKS"
        keystorePass="cT6W2buDs4LEbKMV"
        clientAuth="false"
        SSLProtocol="TLSv1.1+TLSv1.2+TLSv1.3"	/>

        上述Tomcat配置中需要将生成的jks证书放到同级conf目录下,笔者除了8066的 https 端口还额外开放了1001的http端口用于前端调试。

        PS:需要注意的是,如果Tomcat服务集成到了windows服务中,在变动证书配置后需要将服务卸载重新装载到windows services才会生效,这是一个大坑,笔者调试一下午一直以为是证书不对,结果偶然点了startup.bat启动后正常了,进而才发现是services中配置未生效导致。

2、证书和域名的关系

        通过上述配置,整个流程已经可以跑同,通过域名+端口+路由可以访问到我们目标服务器的目标服务上。

        此时记录一个域名访问的小知识,我们的证书申请是通过域名进行绑定的,所以证书生效的前提是通过域名访问。如果使用域名背后的真是IP进行https访问仍会提示网站不安全。

        所以,证书的世界是因为有域名而多姿多彩,没有域名的访问,证书一律不认可。

3、域名和代理的清白

        域名可以作为IP的别称,而代理只是作为不同IP的相同或不同端口之间的请求转发,所以一定程度上来看,域名和代理是清清白白没有任何关系。

        在上述配置中使用Nginx进行端口代理,最终效果使用域名访问时,会先通过DNS解析到具体IP,然后请求到IP+端口后发现是一个代理,进而通过代理跳转到真实服务器,获取请求结果返回客户端。

        此时需要记录下代理的调整。在实际使用中并没有按照Nginx进行代理,而是采用了Windows服务器自带的netsh命令实现了TCP端口转发,其原因有二:1、Nginx体量过大,不适合单纯的请求转发;2、线上服务器使用Nginx频繁出现502请求异常,系Nginx关于请求转发的超时配置等问题。

        所以最终决定使用netsh进行转发,此时担心的另一个问题出现:netsh需不需要携带SSL证书转发。查阅资料显示,netsh仅转发请求,目标服务器处理证书认证也是可以的。

        具体netsh使用指南可以查看笔者另一篇博客:Windows服务器基于netsh命令实现请求转发

        于是最终方案为:域名+端口+路由访问——>线上服务器netsh实现请求跳转——>目标服务器接收https请求并验证SSL证书——>处理请求将数据返回客户端浏览器

三、总结

        在配置微信小程序涉及的资源文件和后端服务时,域名和代理的关系是相对独立且清晰的。域名在网络中充当IP地址的别称,而代理则是在不同IP或不同端口之间进行请求转发的工具。在实际操作中,通过Nginx进行端口代理可以有效实现请求的转发和SSL证书的管理,但考虑到服务器性能和稳定性,有时会选择使用Windows服务器自带的netsh命令来进行TCP端口转发。

        关于域名,它的重要性在于SSL证书的有效性和安全性。SSL证书通常通过域名来绑定,只有通过正确的域名访问才能确保HTTPS连接的安全性,否则会出现浏览器提示网站不安全的情况。因此,域名在HTTPS访问中扮演了关键角色。

        总结来说,域名和代理在微信小程序开发中的应用各有其重要性和功能,通过合理的配置和管理,可以确保系统的安全性和稳定性,提供良好的用户体验。

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是一篇 DNS 域名服务器的详细搭建过程,带有代码命令。 DNS(Domain Name System)是一种将域名映射到 IP 地址的系统,它可以帮助用户更方便地访问互联网。在搭建 DNS 域名服务器之前,您需要准备以下工具和环境: 1. 一台运行 Linux 操作系统的服务器(推荐 CentOS 或 Ubuntu) 2. BIND(Berkeley Internet Name Domain)软件(用于搭建 DNS 服务器) 3. 一个域名(如 example.com) 接下来,我们来详细了解如何搭建 DNS 域名服务器。 第一步:安装 BIND 软件 BIND 软件是一种常用的 DNS 服务器软件,您可以使用以下命令在 Linux 服务器上安装: CentOS: ``` sudo yum install bind bind-utils -y ``` Ubuntu: ``` sudo apt-get update sudo apt-get install bind9 dnsutils -y ``` 安装完成后,您可以使用以下命令检查 BIND 是否安装成功: ``` named -v ``` 如果输出 BIND 的版本信息,说明安装成功。 第二步:配置 DNS 服务器 在安装成功 BIND 软件后,您需要配置 DNS 服务器。以下是一个示例配置文件: ``` options { directory "/var/named"; allow-recursion { any; }; allow-query-cache { any; }; allow-query { any; }; forwarders { 8.8.8.8; }; }; zone "example.com" IN { type master; file "example.com.zone"; allow-update { none; }; }; zone "0.0.10.in-addr.arpa" IN { type master; file "example.com.rev"; allow-update { none; }; }; ``` 您可以使用以下命令打开配置文件: ``` sudo vi /etc/named.conf ``` 将上述配置信息复制到配置文件中,并保存。 接下来,您需要创建两个文件:example.com.zone 和 example.com.rev。这些文件包含了您的域名和 IP 地址的映射关系。 example.com.zone 文件示例: ``` $TTL 86400 @ IN SOA ns1.example.com. root.example.com. ( 2019100101 ; Serial 3600 ; Refresh 1800 ; Retry 604800 ; Expire 86400 ; Minimum TTL ) ; @ IN NS ns1.example.com. ns1 IN A 10.0.0.1 www IN A 10.0.0.2 ``` example.com.rev 文件示例: ``` $TTL 86400 @ IN SOA ns1.example.com. root.example.com. ( 2019100101 ; Serial 3600 ; Refresh 1800 ; Retry 604800 ; Expire 86400 ; Minimum TTL ) ; @ IN NS ns1.example.com. 1 IN PTR ns1.example.com. 2 IN PTR www.example.com. ``` 其中,example.com.zone 文件中定义了域名和 IP 地址的映射关系,example.com.rev 文件中定义了 IP 地址和域名的映射关系。 第三步:启动 DNS 服务器 在配置完成 DNS 服务器后,您需要启动 DNS 服务器,使用以下命令启动服务: CentOS: ``` sudo systemctl start named sudo systemctl enable named ``` Ubuntu: ``` sudo service bind9 start sudo update-rc.d bind9 defaults ``` 至此,您已经成功搭建了 DNS 域名服务器,可以使用您的域名访问互联网了。 希望本篇文章对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aikes902

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值