letsencrypt+nginx+tomcat
一、NGINX安装
参考:https://blog.csdn.net/luckyzsion/article/details/76473039
二、安装certbot工具
yum install -y epel-release
yum install -y certbot
三、初次申请证书
1、配置nginx,主要新增location ~ /.well-known/acme-challenge,获取证书时,需要验证域名有效性。修改完nginx.conf后,执行命令nginx -s reload
server {
listen 80;
server_name 119.23.24.173;
location / {
proxy_pass http://servers2.mydomain.com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~ /.well-known/acme-challenge {
root /usr/local/nginx/html;
allow all;
}
}
2、获取证书
# 使用方法:certbot certonly --webroot -w [Web站点目录] -d [站点域名] -m [联系人email地址] --agree-tos
certbot certonly --webroot -w /usr/local/nginx/html -d www.xxx.com -m xx@qq.com --agree-tos
获取成功后,证书保存位置:
/etc/letsencrypt/live/www.xxx.com/
查看证书有效期
openssl x509 -noout -dates -in /etc/letsencrypt/live/www.xxx.com/fullchain.pem
四、配置nginx、tomcat
服务器部署采用nginx作为反向代理、或负载均衡,外面访问采用https,nginx访问tomcat采用http,这样好处是tomcat不需要配置证书,只需要nginx配置即可。
1、nginx证书配置,新增以下内容。
upstream tomcat {
server 127.0.0.1:8080;
}
server {
listen 443 ssl;
server_name www.xxx.com;
ssl_certificate /etc/letsencrypt/live/www.xxx.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.xxx.com/privkey.pem;
ssl on;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto https;
proxy_redirect off;
proxy_connect_timeout 240;
proxy_send_timeout 240;
proxy_read_timeout 240;
proxy_pass http://tomcat;
}
}
重启时可能报错,提示https错误,请查看附录1
2、tomcat主要配置如下,proxyPort配置为nginx https所监听的端口号
五、定时更新证书
执行命令 crontab -e
0 00 01 * * certbot renew --quiet --pre-hook "/usr/local/nginx/sbin/nginx -s stop" --post-hook "/usr/local/nginx/sbin/nginx"
每月1号0点更新 --quiet不返回信息
附录1 Nginx如果未开启SSL模块,配置Https时提示错误
原文:https://www.cnblogs.com/ghjbk/p/6744131.html
原因也很简单,nginx缺少http_ssl_module模块,编译安装的时候带上--with-http_ssl_module配置就行了,但是现在的情况是我的nginx已经安装过了,怎么添加模块,其实也很简单,往下看: 做个说明:我的nginx的安装目录是/usr/local/nginx这个目录,我的源码包在/usr/local/src/nginx-1.6.2目录
nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:37
1.2 Nginx开启SSL模块
切换到源码包:
cd /usr/local/src/nginx-1.11.3
查看nginx原有的模块
/usr/local/nginx/sbin/nginx -V
在configure arguments:后面显示的原有的configure参数如下:
--prefix=/usr/local/nginx --with-http_stub_status_module
那么我们的新配置信息就应该这样写:
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
运行上面的命令即可,等配置完
配置完成后,运行命令
make
这里不要进行make install,否则就是覆盖安装
然后备份原有已安装好的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
然后将刚刚编译好的nginx覆盖掉原有的nginx(这个时候nginx要停止状态)
cp ./objs/nginx /usr/local/nginx/sbin/
然后启动nginx,仍可以通过命令查看是否已经加入成功
/usr/local/nginx/sbin/nginx -V
附录2 cer或者pem转换为jks证书,tomcat配置证书
原文:https://www.iyunw.cn/archives/cer-huo-zhe-pem-zhuan-huan-wei-jks-zheng-shu-tomcat-pei-zhi-zheng-shu/
1. 默认pem证书转换为Tomcat需要的jks
①pem或者cer文件转换为pfx文件,会让设置密码我这里设置的全部为password
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.pem
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.pem
②pfx文件转换为jks文件
keytool -importkeystore -srckeystore server.pfx -destkeystore server.jks -srcstoretype PKCS12 -deststoretype JKS
keytool -importkeystore -srckeystore server.pfx -destkeystore server.jks -srcstoretype PKCS12 -deststoretype JKS
2. 配置Tomcat配置文件server.xml文件,会让设置密码我这里设置的全部为password
Shell
port="8443" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" keystoreFile="/root/key/server.jks" keystorePass="password" clientAuth="false" sslProtocol="TLS" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256" /> port="8443" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" keystoreFile="/root/key/server.jks" keystorePass="password" clientAuth="false" sslProtocol="TLS" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256" /> 3.重启Tomcat 附录3: springboot 2.0配置内置tomcat 原文:https://blog.csdn.net/wd2014610/article/details/79587161 1、之前老的版本TomcatEmbeddedServletContainerFactory取的是这个类 2、在SpringBoot 2.0.0框架中,已经没有类TomcatEmbeddedServletContainerFactory了 3、在老版本的Tomcat配置中,构造tomcatFactory的bean @Bean public TomcatEmbeddedServletContainerFactory tomcatFactory() { TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory(); tomcatFactory.addConnectorCustomizers(new GwsTomcatConnectionCustomizer()); return tomcatFactory; } 4、那么早SpringBoot 2.0.0中该怎么构建呢? 去到SpringBoot官方文档这里写链接内容、找到Tomcat配置 5、最新的已经有了全新的类了 6、事例 7、那么就可以用全新的ServletWebServerFactory类来构造Tomcat的配置了 @Bean public ServletWebServerFactory servletContainer() { TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(); tomcat.addConnectorCustomizers(new GwsTomcatConnectionCustomizer()); return tomcat; } 8、最后附上全新的Tomcat配置 package com.gws.configuration; import org.apache.catalina.connector.Connector; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.servlet.MultipartConfigFactory; import org.springframework.boot.web.servlet.server.ServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.servlet.MultipartConfigElement; /** * 使用tomcat配置 * * @version * @author * */ @Configuration public class TomcatConfig { @Value("${spring.server.port}") private String port; @Value("${spring.server.acceptorThreadCount}") private String acceptorThreadCount; @Value("${spring.server.minSpareThreads}") private String minSpareThreads; @Value("${spring.server.maxSpareThreads}") private String maxSpareThreads; @Value("${spring.server.maxThreads}") private String maxThreads; @Value("${spring.server.maxConnections}") private String maxConnections; @Value("${spring.server.protocol}") private String protocol; @Value("${spring.server.redirectPort}") private String redirectPort; @Value("${spring.server.compression}") private String compression; @Value("${spring.server.connectionTimeout}") private String connectionTimeout; @Value("${spring.server.MaxFileSize}") private String MaxFileSize; @Value("${spring.server.MaxRequestSize}") private String MaxRequestSize; @Bean public ServletWebServerFactory servletContainer() { TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(); tomcat.addConnectorCustomizers(new GwsTomcatConnectionCustomizer()); return tomcat; } @Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); // 单个数据大小 factory.setMaxFileSize(MaxFileSize); // KB,MB /// 总上传数据大小 factory.setMaxRequestSize(MaxRequestSize); return factory.createMultipartConfig(); } /** * * 默认http连接 * * @version * @author liuyi 2016年7月20日 下午7:59:41 * */ public class GwsTomcatConnectionCustomizer implements TomcatConnectorCustomizer { public GwsTomcatConnectionCustomizer() { } @Override public void customize(Connector connector) { connector.setPort(Integer.valueOf(port)); connector.setAttribute("connectionTimeout", connectionTimeout); connector.setAttribute("acceptorThreadCount", acceptorThreadCount); connector.setAttribute("minSpareThreads", minSpareThreads); connector.setAttribute("maxSpareThreads", maxSpareThreads); connector.setAttribute("maxThreads", maxThreads); connector.setAttribute("maxConnections", maxConnections); connector.setAttribute("protocol", protocol); connector.setAttribute("redirectPort", "redirectPort"); connector.setAttribute("compression", "compression"); connector.setAttribute("scheme", "https"); connector.setAttribute("proxyPort", 9092); } } } 9、最后在application.properties,进行配置 #嵌入tomcat配置 spring.server.port=8095 #和CPU数 spring.server.acceptorThreadCount=4 spring.server.minSpareThreads=50 spring.server.maxSpareThreads=50 spring.server.maxThreads=1000 spring.server.maxConnections=10000 #10秒超时 spring.server.connectionTimeout=10000 spring.server.protocol=org.apache.coyote.http11.Http11Nio2Protocol spring.server.redirectPort=443 spring.server.compression=on #文件请求大小 spring.server.MaxFileSize=300MB spring.server.MaxRequestSize=500MB