一,证书挂着宿主的nginx上

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

server {
listen 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. TLSv1.;
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:; #指向本机docker 容器端口
}
error_page /.html;
location = /40x.html {
}
error_page /50x.html;
location = /50x.html {
}
}

二,证书挂载到容器项目上

这里以nginx为例,docker文件如下:

FROM alpine
#安装nginx服务器
RUN apk add --update bash nginx
#拷贝证书
COPY ./cert /usr/nginx/cert
#拷贝项目文件
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 443
#切换到nginx目录,启动nginx
WORKDIR /run/nginx
ENTRYPOINT nginx -g "daemon off;"

或直接 from nginx

#这里我们用alpine简版就可以
FROM nginx:alpine
#拷贝证书
COPY ./cert /usr/nginx/cert
#拷贝项目配置文件,配置文件主要是挂载证书开启443监听
COPY ./nginx/nginx.conf /etc/nginx/nginx.conf
COPY ./nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf
COPY ./www /usr/share/nginx/html/
WORKDIR /usr/share/nginx/html/
RUN chown -R daemon:daemon * && chmod -R *
EXPOSE
EXPOSE

nginx 配置文件

1) nginx.conf

user nginx;
worker_processes 1; error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid; events {
worker_connections 1024;
} http {
include /etc/nginx/mime.types;
default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on;
#tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf;
}

2) conf.d/default.conf

server {
listen 80;
listen 443 ssl; 开启443 ssl
server_name www.abc.com; #你的域名
ssl_certificate "/usr/nginx/cert/cn.pem"; #证书文件
ssl_certificate_key "/usr/nginx/cert/cn.key"; #证书秘钥 location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}

三,spingboot项目内部挂在证书

项目目录结构如下:

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

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

打包成docker image

 docker build -t springio/demo-docker .

运行

 docker run -t -p : 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.-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
RUN openssl genrsa -des3 -passout pass:${certPassword} -out server.key
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 -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 ejiyuan@.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 ejiyuan@263.com --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 : -p : -v /etc/letsencrypt:/etc/letsencrypt  quay.io/letsencrypt/letsencrypt auth --standalone -m ejiyuan@email.com --agree-tos -d you.domain.com

-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 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
#安装nginx服务器
RUN apk add --update bash nginx
#拷贝项目文件
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
#挂在外部路径方便查看生产的证书与容器内部nginx配置
VOLUME ["/etc/letsencrypt","etc/nginx"]
#切换目录设置权限
WORKDIR /usr/share/nginx/html
RUN chown -R daemon:daemon * && chmod -R 755 *
EXPOSE 80
EXPOSE 443
#切换到nginx目录,启动nginx
WORKDIR /run/nginx
ENTRYPOINT certbot certonly --standalone -n --agree-tos --email ejiyuan@gmail.com --preferred-challenges http -d you.domain.com && nginx -g "daemon off;"

因一个Dockerfile不能同时FROM certbot又FROM nginx,所以这里使用alpine(它一个小型的 linux发型版本,想了解他看这里:Alpine Linux 使用简介)然后安装 certbot和nginx

对应的nginx配置文件nginx.conf如下:

user nginx;
worker_processes ; error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid; events {
worker_connections ;
} http {
include /etc/nginx/mime.types;
default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on;
#tcp_nopush on; keepalive_timeout ; #gzip on; include /etc/nginx/conf.d/*.conf;
}

conf.d/default.conf

server {
listen ;
listen ssl;
server_name www.abc.cn; #配置的域名
ssl_certificate "/etc/letsencrypt/live/www.abc.cn/fullchain.pem"; #letsencrypt证书路径,证书会自动生成在这个路径下面
ssl_certificate_key "/etc/letsencrypt/live/www.abc.cn/privkey.pem"; #letsencrypt秘钥路径,证书秘钥会自动生成在这个路径下面
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}

六,参考文档

全民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环境

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

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

     1,安装 docker yum install docker 使用Docker 中国加速器 vim /etc/docker/daemon.json 添加下面代码 { "registry-m ...

  2. spring boot (2):spring boot 打包tomcat、tomcat 部署多个项目、服务器部署项目SSL 设置(阿里云)

    一.spring boot 内置tomcat配置https: 关于自签名证书可以看下上一篇 spring boot1 更详细的可以看转载 https://www.jianshu.com/p/8d4ab ...

  3. 免费 SSL 安全证书

    为了保证网上传输信息的安全而在自己的 Linode VPS 上部署 SSL 加密服务.商业 CA 较贵,所以使用了自己签发的 CA.网友神爱的留言提到了 StartSSL 的免费 CA,稍做了一些调查 ...

  4. docker开启2376端口CA认证及IDEA中一键部署docker项目

    嘿,大家好,今天更新的内容是docker开启2376端口CA认证及IDEA中一键部署docker项目... 先看效果 我们可以通过idea一键部署docker项目,还以通过idea的控制台实时查看容器 ...

  5. windows环境30分钟从0开始快速搭建第一个docker项目(带数据库交互)

    前言 小白直接上手 docker  构建我们的第一个项目,简单粗暴,后续各种概念边写边了解,各种概念性的内容就不展开,没了解过的点击 Docker 教程 进行初步了解. Docker 是一个开源的应用 ...

  6. SSL安全证书-概念解析

    一.关于证书 数字证书是一种认证机制.简单点说,它代表了一种由权威机构颁发授权的安全标志. 由来 在以前,传统网站采用HTTP协议进行数据传输,所有的数据几乎都用的明文,很容易发生隐私泄露.为了解决安 ...

  7. 网站如何启用SSL安全证书?IIS7启用新建Https:/

    网站使用SSL,通过SSL证书申请,然后导入之后.我们需要对网站进行设置才能正常使用SSL证书,具体如何操作让网站启用SSL呢,本经验以一个网站添加SSL主机头的方式为例来,网站启用SSL服务器安全证 ...

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

    浅谈https\ssl\数字证书 http://www.cnblogs.com/P_Chou/archive/2010/12/27/https-ssl-certification.html 全球可信的 ...

  9. OpenSSL 与 SSL 数字证书概念贴

    SSL/TLS 介绍见文章 SSL/TLS原理详解(http://seanlook.com/2015/01/07/tls-ssl). 如果你想快速自建CA然后签发数字证书,请移步 基于OpenSSL自 ...

随机推荐

  1. Linux下MySQL在知道密码的情况下修改密码

    1.在知道原密码的情况下,进入MySQL: mysql -u root -p 2.进入 mysql数据库,然后通过语句修改密码: 我的MySQL版本是:mysql  Ver 14.14 Distrib ...

  2. read读文件

    FILE *fp=fopen("F:\\QQBrowser_Setup_DNF.exe", "rb"); fseek(fp, , SEEK_END); long ...

  3. Visual C++ 6.0对任意三个数字进行排序

    # include <stdio.h> int main (void) { int a, b, c; int t; printf("请输入三个整数,中间以空格隔开:") ...

  4. xdoj-1297 Tr0y And His Startup

    题目: 1297: Tr0y And His Startup 时间限制: 1 Sec  内存限制: 256 MB提交: 18  解决: 8[提交][状态][讨论版] 题目描述 Tr0y创办了一家安全公 ...

  5. 20155208徐子涵《网络对抗》Exp9 Web安全基础

    20155208徐子涵<网络对抗>Exp9 Web安全基础 实验要求 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 实验过程 最后一次了,没有选择尝试免考项目 ...

  6. 最详细最权威的Android 编码规范

    1. 前言 这份文档参考了 Google Java 编程风格规范和 Google 官方 Android 编码风格规范.该文档仅供参考,只要形成一个统一的风格,见量知其意就可. 1.1 术语说明 在本文 ...

  7. 渗透测试学习 二、Windows基础

    系统目录  服务  端口  注册表  黑客常用DOS命令(在拿到shell时会用到) 一.  系统目录 Windows目录  系统的安装目录 System32àconfigàSAM文件  是用户密码的 ...

  8. 学习笔记CB006:依存句法、LTP、n元语法模型、N-最短路径分词法、由字构词分词法、图论、概率论

    依存句法分析,法国语言学家L.Tesniere1959年提出.句法,句子规则,句子成分组织规则.依存句法,成分间依赖关系.依赖,没有A,B存在错误.语义,句子含义. 依存句法强调介词.助词划分作用,语 ...

  9. 10. Firewalls (防火墙 2个)

    Netfilter是在标准Linux内核中实现的强大的包过滤器. 用户空间iptables工具用于配置. 它现在支持数据包过滤(无状态或有状态),各种网络地址和端口转换(NAT / NAPT),以及用 ...

  10. smart contract 知识点

    知识点 memory vs storage vs stack storage , where all the contract state variables reside. Every contra ...