记一次服务器配置https过程

之前配置HTTPS协议都是直接网上找例子照搬,最近配置公司服务器时发现分布式服务配置存在很多问题,于是写一下配置过程,记录一下

分布式系统中大部分会使用到nginx+tomcat实现服务部署及负载均衡,尤其时springboot流行起来后,直接一个jar包放到服务器运行,使用内置tomcat,今天主要就是从一下几个模块开讲。

  • nginx配置https
  • tomcat配置https
  • springboot配置https

首先我们需要了解一下
https和http的区别:
HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
主要区别:

  • https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用,也可以自己生成,但不安全。
  • http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议
  • http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
  • http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

了解了两者的不同,我们就开始今天的主要内容了
考虑到开发环境和部署环境的不同,我们分两步介绍nginx的https配置
1)windows服务器下搭建nginx的https

  • 安装OpenSSL
    OpenSSL下载地址
    直接运行安装即可,配置环境变量:
    新增环境变量
    变量名:OPENSSL_HOME
    变量值:C:\OpenSSL-Win64\bin;
    修改Path变量结尾添加一条: %OPENSSL_HOME%

  • 安装Nginx(请自行百度,不再介绍)
    nginx官网
    进入到nginx目录下,双击nginx.exe文件即可启动服务器。
    在浏览器地址栏输入http://localhost,如果可以成功访问到Nginx的欢迎界面,则说明安装成功

  • 生成证书
    首先在Nginx安装目录中创建ssl文件夹用于存放证书
    执行cmd cd到nginx/config/ssl目录
    创建私钥:openssl genrsa -des3 -out buduhuisi.key 1024 两次输入密码,记住密码,后边会用到

创建csr证书:openssl req -new -key buduhuisi.key -out buduhuisi.csr

去除密码校验:复制buduhuisi.key并重命名为buduhuisi.key.org然后执行命令以去除口令:
openssl rsa -in buduhuisi.key.org -out buduhuisi.key
这里需要输入上边记录的密码了

生成crt证书:openssl x509 -req -days 365 -in buduhuisi.csr -signkey buduhuisi.key -out buduhuisi.crt
至此证书就生成完毕了

  • 修改Nginx的nginx.conf配置文件
server {
    listen       443 ssl; #直接放到端口后面可同时使用http和https
    #ssl on; 开启https
    server_name  localhost;

    ssl_certificate      C://nginx//config//ssl//buduhuisi.crt; 
    ssl_certificate_key  C://nginx//config//ssl//buduhuisi.key;

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

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

    location / {
      root   html;               
      index  index.html index.htm;  
    }
}

2)liunx服务器下搭建nginx的https(我已安装nginx,所以直接添加模块)

#跳转到nginx路径
cd /usr/local/nginx/sbin
#nginx 模块
./nginx -V
  • 安装ssl模块
#切换到源码包
cd /usr/local/src/nginx-1.11.3
#重新配置nginx,加载ssl模块
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
#重新编译,这里不需要make  install,否则会覆盖安装
make
#备份原有安装的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
#覆盖新的nginx
cp ./objs/nginx /usr/local/nginx/sbin/ 
#提示是否覆盖,输入Y
#重启nginx 
./nginx
#查看模块信息
./nginx -V
  • 生成证书
    创建服务器证书密钥文件 server.key:openssl genrsa -des3 -out server.key 1024
    输入密码,确认密码,自己随便定义,但是要记住,后面会用到

创建服务器证书的申请文件 server.csr:openssl req -new -key server.key -out server.csr
按要求填写信息

备份一份服务器密钥文件:cp server.key server.key.org

去除文件口令:openssl rsa -in server.key.org -out server.key

生成证书文件server.crt:openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

  • 修改配置文件
server{
		#比起默认的80 使用了443 默认 是ssl方式  多出default之后的ssl
        listen 443 default ssl; #default 可省略
		#开启  如果把ssl on;这行去掉,ssl写在443端口后面。这样http和https的链接都可以用
        ssl on;
		#证书(公钥.发送到客户端的)
        ssl_certificate ssl/server.crt;
        ssl_certificate_key ssl/server.key;
        server_name www.daj.com;
        location / {
        	proxy_redirect off;
			proxy_pass https://www.tao.com/;  
        }       
}

有时候我们的服务是nginx+tomcat的,所以我们需要开启tomcat对https的支持,当然也可以直接配置证书到tomcat开启服务的https
开启tomcat的https支持:
(1)Connector节点加入 redirectPort="443" proxyPort="443" //结合实际业务
(2)加入新的Value节点

<Valve className="org.apache.catalina.valves.RemoteIpValve"
	remoteIpHeader="x-forwarded-for"
	remoteIpProxiesHeader="x-forwarded-by"
	protocolHeader="x-forwarded-proto"/>

至此nginx配置https完成

接下来我们来实现tomcat服务器的https配置

  • 生成证书(使用jdk生成,免费)
    (1)在jdk的安装目录\bin\keytool.exe下打开keytool.exe

    (2)执行命令:keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "g:\tomcat.keystore"

    (3)按要求填写对应信息后执行完毕,到指定目录查找证书文件

  • 修改tomcat服务器配置server.xml
    定位到tomcat服务器的安装目录, 找到conf下的server.xml文件,修改端口配置

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  
               maxThreads="150" scheme="https" secure="true"  
               clientAuth="false" sslProtocol="TLS"   
        keystoreFile="g:\tomcat.keystore"  
        keystorePass="123456" /> 
  • 重启tomcat,访问https://localhost:8443/

至此tomcat配置https完成

最后一块内容,修改springboot的内置服务器使用https

  • 证书创建直接参考上述tomcat证书的生成流程
  • 修改配置application.yml
server.port=8083
server.ssl.key-store=server.keystore //证书位置
server.ssl.key-alias=tomcat
server.ssl.enabled=true
server.ssl.key-store-password=123456
server.ssl.key-store-type=JKS

证书可以放在绝对路径也可以放到系统的根路径下

  • 配置http访问自动转https访问(可以不做,同时支持http和https请求
    向spring容器中注入两个Bean,代码如下
 @Bean
    public Connector connector(){
        Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setPort(80);
        connector.setSecure(false);
        connector.setRedirectPort(443);
        return connector;
    }

    @Bean
    public TomcatServletWebServerFactory tomcatServletWebServerFactory(Connector connector){
        TomcatServletWebServerFactory tomcat=new TomcatServletWebServerFactory(){
            @Override
            protected void postProcessContext(Context context) {
                SecurityConstraint securityConstraint=new SecurityConstraint();
                securityConstraint.setUserConstraint("CONFIDENTIAL");
                SecurityCollection collection=new SecurityCollection();
                collection.addPattern("/*");
                securityConstraint.addCollection(collection);
                context.addConstraint(securityConstraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(connector);
        return tomcat;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章