docker项目ssl 安全证书的种种

一,使用nginx代理,将证书挂着宿主的nginx上

这个很简单,只需要修改宿主nginx的配置文件即可

server {
        listen 443 ssl default;
        server_name www.abc.com; #项目域名
        ssl_certificate "cert/ssl_certificate.pem"; #证书文件
        ssl_certificate_key "cert/ssl_certificate.key"; #秘钥文件
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #SSL算法加密选项
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        location / {
            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_pass http://127.0.0.1:9001; #指向本机docker 容器端口
        }
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

二,spingboot项目内部挂在证书

项目目录结构如下:

即我们在项目根目录创建一个cert目录里面存放证书,然后我们修改项目配置文件application.yml挂上证书

server:
  ssl:
    key-store: classpath:cert/ssl_certificate.pfx #证书文件
    key-store-password: 123456 #证书密码

打包成docker image

 docker build -t springio/demo-docker .

运行

 docker run -t -p 8433:8080 springio/demo-docker

本地输入http://www.abc.com:8433 会提示

Bad Request
This combination of host and port requires TLS.

直接改为 https://www.abc.com:8433 访问正常

 三,使用openssl生成不受信任的证书

上面两种方法都是在我们有证书的情况,如果你没有证书,可以使用openssl生产一个测试证书,在我们的Dokcerfile中加入证书生成

FROM openjdk
VOLUME /tmp
ADD demo-docker-0.0.1-SNAPSHOT.war app.war
RUN sh -c ‘touch /app.war‘
RUN echo "Asia/Shanghai" > /etc/timezone
ENV JAVA_OPTS=""
ENV spring.profiles.active="prod"

#以下是生成证书
#定义签名密码
ENV certPassword 123456
RUN openssl genrsa -des3 -passout pass:${certPassword} -out server.key 2048
RUN openssl rsa -passin pass:${certPassword} -in server.key -out server.key
RUN openssl req -sha256 -new -key server.key -out server.csr -subj ‘/CN=www.abc.com‘ #这里是证书绑定的域名
RUN openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
RUN openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt -certfile server.crt -passout pass:${certPassword}
#将证书文件绑定到项目中
ENV key-store="server.pfx"
#将证书密码传递给项目
ENV key-password=${certPassword}
#编译选项
ENTRYPOINT ["java", "-jar", "/app.war"]

这里有两点要注意,dockerfile文件中FROM 不能来源于简化版即不是“FROM openjdk:8-jdk-alpine” ,因为alpine版本的jdk中不包含openssl,关于openssl详细使用可以参考这里 https://www.cnblogs.com/yangxiaolan/p/6256838.html

对应的项目配置文件application.yml内容如下

server:
  ssl:
    key-store: ${key-store} #接收证书文件
    key-store-password: ${key-password} #接收证书密码

启动docker项目,浏览器输入 https://www.abc.com,会提示证书不受信任

登录到docker bash 会看到对应的证书文件

四,使用Let‘s Encrypt 生成受信任的证书

Let‘s Encrypt生成证书有多种方式:


Plugin


认证


安装


备注


认证方式 (端口)


apache


Y


Y


自动获取和安装证书,适用于Apache2.4 on OSes with libaugeas0 1.0+。


tls-sni-01 (443)


webroot


Y


N


通过webserver的root目录认证来获取证书,适用于处于运行状态的webserver。


http-01 (80)


nginx


Y


Y


自动获取和安装证书,适用于Nginx。


tls-sni-01 (443)


standalone


Y


N


通过letsencrypt自带的standalone服务来获取证书,standalone服务将占用服务器的80或443端口,这就意味着服务器本身的webserver需要处于关闭状态,除非它使用特殊端口。


http-01 (80) or tls-sni-01 (443)


DNS plugins


Y


N


通过修改DNS记录来认证域名所有者以获取证书,这是使用letsencrypt为通配符域名获取证书的唯一方式。


dns-01 (53)


manual


Y


N


以用户自定义的方式获取证书,根据提示指令,用户自己来完成域名认证。即使用交互式或脚本钩子的方式获取证书。


http-01 (80), dns-01 (53) or tls-sni-01 (443)

使用,Let‘s Encrypt生成证书必须在你的服务器上完成,而且必须确认你的域名已经解析到服务器上,否者无法完成验证,会提示没有权限“ urn:ietf:params:acme:error:unauthorized” ,这里介绍两种比较常用方式

必须保证你在网站在运行,可以通过域名的80端口正常访问,需要在你的服务器上安装 certbot,最好不要使用yum install certbot 安装 这里会有依赖问题,因为Certbot是Python程序,最好先创建一个Python虚拟环境,然后再安装Certbot,具体步骤如下:

sudo yum install python-virtualenv #安装虚拟环境软件包(针对于Python2.7)
sudo virtualenv /usr/local/python-certbot #创建虚拟环境
source /usr/local/python-certbot/bin/activate #激活虚拟环境
pip install certbot #安装Certbot
pip install certbot-nginx #安装nginx插件,如果不使用 nginx模式生成证书可不需要

也可以不安装certbot,使用“quay.io/letsencrypt/letsencrypt”镜像完成只需要在你的服务器上 docker pull quay.io/letsencrypt/letsencrypt 然后通过下面命令启动

1,webroot方式:

执行证书生成命令

certbot certonly --webroot -w /usr/share/nginx/html -d www.abc.com -m [email protected]163.com --agree-tos

docker 镜像方式

docker run --rm -p 8770:80 -v /etc/letsencrypt:/etc/letsencrypt -v /usr/share/nginx/html:/usr/share/nginx/html quay.io/letsencrypt/letsencrypt auth --webroot -w /usr/share/nginx/html -d q.meylink.cn -m [email protected] --agree-tos

  -w 指定网站项目目录,这个项目必须是可用的,而且是通过你的域名80端口能正常访问的

  -d 指定生成蒸鱼的域名 这个域名必须已经解析到执行命令的本服务器上

  -m 指定一个email 最好是真实的电邮地址

webroot方式,必须你的服务的 80 端口上运行一个能处理静态文件的 web 服务,我这里 nginx 为例 (注意,webroot + nginx 与 nginx 是完全不同的两种方式)

    server {
        listen       80 default_server;  # 必须是80端口
        server_name  www.abc.com;  # 必须能够解析到本机
        root         /usr/share/nginx/html; #项目所在目录
        location / {
           index index.html;
        }
    }

在执行命令后,certbot 会向指定的 webroot 目录中添加一个随机文件,随后 letsencrypt 会通过 http 访问那个文件,比如 http://www.abc.com/.well-known/acme-challenge/gdEMr7ZXOiZE51he9QwuvnbrrTnkwlpFhNAcArBt2uE, 如果能返回正确的数据则通过认证,否则认证失败,执行结果如下:

2,standalone方式:

这个方式不需要先部署项目,但是必须保证你的域名能解析到服务器上

certbot certonly --standalone -n --agree-tos --email you@gmail.com --preferred-challenges http -d you.domain.com

 docker 镜像方式

docker run --rm -p 80:80 -p 443:443 -v /etc/letsencrypt:/etc/letsencrypt  quay.io/letsencrypt/letsencrypt auth --standalone -m ejiyuan@email.com --agree-tos -d www.meylink.cn

-n 非交互式
--email 指定账户
--agree-tos 同意服务协议
--preferred-challenges http 使用http模式 必须保证80端口没有被占用
--preferred-challenges tls-sni:使用443端口必须保证80端口没有被占用

默认 standalone 是使用 443 端口,也就是说要停止服务器现在占用 443 端口的进程,我们也可以将其改为使用 80 端口,同样道理,这时需要停止 80 端口的占用,执行结果

3,apache与nginx模式,可是非常简单的生成并挂在证书这里以nginx为例

保证你的域名可以解析到本机,并且nginx已安装,设置nginx配置文件

server {
        server_name you.domain.com;
}

然后执行

certbot --nginx -d a.abc.com

执行结果如下:

nginx配置文件修改如下:

server {
  server_name a.abc.com;
  ....
  #一下内容是 Certbot 加入
  listen 443 ssl; # managed by Certbot
  ssl_certificate /etc/letsencrypt/live/a.abc.com/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/a.abc.com/privkey.pem; # managed by Certbot
  include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

4,生成证书部署docker image

FROM alpine
#安装证书生成工具
RUN apk add --update bash certbot
RUN apk add --no-cache libressl
#挂在一个外部路径
VOLUME ["/etc/letsencrypt"]

RUN apk add --update bash nginx
#拷贝证书
#COPY ./cert /etc/letsencrypt/live
#拷贝项目文件
COPY ./www /usr/share/nginx/html
#拷贝项目配置文件
COPY ./nginx/nginx.conf /etc/nginx/nginx.conf
COPY ./nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf
#切换目录设置权限
WORKDIR /usr/share/nginx/html
RUN chown -R daemon:daemon * && chmod -R 755 *
EXPOSE 80
EXPOSE 433
#切换到nginx目录,启动nginx
WORKDIR /run/nginx
#ENTRYPOINT nginx -g "daemon off;"
ENTRYPOINT certbot certonly --standalone -n --agree-tos --email [email protected] --preferred-challenges http -d www.meylink.cn && nginx -g "daemon off;"

参考文档

全民https时代,Let‘s Encrypt免费SSL证书的申请及使用(Tomcat版)

https 证书工具 Letsencrypt 简单教程

Certbot 自动化生成 https 证书

Letsencrypt SSL免费证书申请(Docker)

CentOS7运行Certbot提示:ImportError: ‘pyOpenSSL‘ module missing required functionality. Try upgrading to v0.14 or newer.

Docker:使用Dockerfile构建Nginx镜像

通过Laradock学Docker-HTTPS

给Docker中的Nginx搭建HTTPS环境

原文地址:https://www.cnblogs.com/ejiyuan/p/10335396.html

时间: 2024-11-01 15:36:57

docker项目ssl 安全证书的种种的相关文章

使用nginx实现一个主机部署多域名指向不同docker项目

原文:使用nginx实现一个主机部署多域名指向不同docker项目  1,安装 docker yum install docker 使用Docker 中国加速器 vim /etc/docker/daemon.json 添加下面代码 { "registry-mirrors": ["https://registry.docker-cn.com"], "live-restore": true } (这个文件 初始状态是空的 只有“{}”) 启动服务 s

如何用Java代码来把SSL的证书自动导入到Java的秘钥存储文件(keystore)

我们在开发或者使用SSL的过程中,很多的软件需要我们提供java的keystore,特别是一些基于Java的中间件产品. 我们常规的做法是JDK自带的工具命令(keytool)去做,比如,下面的例子 keytool -import -v -alias EnTrust2048 -file D:\certs\EnTrust2048.cer -keystore D:\certs\test.jks keytool -import -v -alias EntrustCertificationAuthori

Axis 1 https(SSL) client 证书验证错误ValidatorException workaround

Axis 1.x 编写的client在测试https的webservice的时候, 由于client 代码建立SSL连接的时候没有对truststore进行设置,在与https部署的webservice 连接会在运行时报出: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath

浅谈https\ssl\数字证书[转载]

在互联网安全通信方式上,目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了.本文追本溯源围绕这个模式谈一谈. 名词解释 首先解释一下上面的几个名词: https:在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议.http协议直接放置在TCP协议之上,而https提出在http和TCP中间加上一层加密层.从发送端看,这一层负责把http的内容加密后送到下层的TCP,从接收方看,这一层负责将TCP送来的数据解密还原成http的内容.

OpenSSL 与 SSL 数字证书概念贴

SSL/TLS 介绍见文章 SSL/TLS原理详解. 如果你想快速自建CA然后签发数字证书,请移步 基于OpenSSL自建CA和颁发SSL证书. 首先简单区分一下HTTPS.SSL.OpenSSL三者的关系: SSL是在客户端和服务器之间建立一条SSL安全通道的安全协议,而OpenSSL是TLS/SSL协议的开源实现,提供开发库和命令行程序.常说的HTTPS是HTTP的加密版,底层使用的加密协议是SSL. 1.PKI.CA与证书 PKI 就是 Public KeyInfrastructure 的

浅谈https\ssl\数字证书

全球可信的SSL数字证书申请:http://www.shuzizhengshu.com 在互联网安全通信方式上,目前用的最多的就是https配合ssl和数字证书来保证传输和认证安全了.本文追本溯源围绕这个模式谈一谈. 名词解释 首先解释一下上面的几个名词: https:在http(超文本传输协议)基础上提出的一种安全的http协议,因此可以称为安全的超文本传输协议.http协议直接放置在TCP协议之上,而https提出在http和TCP中间加上一层加密层.从发送端看,这一层负责把http的内容加

解决Linux下Svn检出Windows SVN服务器上项目SSL handshake failed: SSL error: Key usage violation in certificate has been detected.

在Linux上检出windows SVN服务器上项目时出现了SSL handshake failed: SSL error: Key usage violation in certificate has been detected.的错误. 最后通过从网上检索找到了一个答案: 可以同时解决掉在Ubuntu上和CentOS上检出失败的问题. 在Windows注册表中加入注册项: 32位机器: [HKEY_LOCAL_MACHINE\SOFTWARE\VisualSVN\VisualSVN Serv

在CentOS6,CentOS7安装 Let'sEncrypt 免费SSL安全证书

相对来说,个人网站建立SSL是昂贵的,而且往往过程繁琐.一个标准的2048位证书费用至少150美元/年,网站除了要支付一笔昂贵的费用.重新配置Web服务器,并需要解决大量的配置错误.这让广大中小网站望而生畏. 然而,Let's Encrypt免费证书的开放,极大推进了国内 HTTPS 的进程.Let's Encrypt 真正的意义在于,它推动了 HTTPS 在小型网站和个人网站中的应用,加速全面 HTTPS 时代的到来.Let's Encrypt 的最大贡献是它的 ACME 协议,第一份全自动服

IIS SSL客户端证书(忽略/接受/必须)之三——思考验证(3)

Technorati 标记: IIS,CA,证书,SSL,客户端证书,夏明亮 [三:CA服务器中删除客户端证书(CA),客户端可用?] 1.在CA Server中吊销刚颁发的客户端证书. 2.测试使用已经被吊销的客户端证书访问WEB Site. 证明:删除CA服务器中的证书后,客户端证书依然可用. [四:证明客户端证书注册时不写friendly name是否正常?] 1.申请客户端证书. 2.Name随便写. 3.提交. 4.手动颁发证书. 5.安装证书. 6.测试使用新证书访问WEB站点. 7