Tomcat下的SSL证书安装方法

一、证书导入

导入中级证书: keytool -import -alias intermediate -keystore c:server.jks -chinasslcrt –file c:intermediate.crt 提示“认证已添加至keystore中”则导入成功。

导入交叉证书: keytool -import -alias cross -keystore c:server.jks -chinasslcrt -file c:chain.crt 提示“认证已添加至keystore中” 则导入成功。

导入服务器SSL证书: keytool -import -alias mykey -keystore c:server.jks -chinasslcrt -file c:server.crt 输入密码后 提示:“认证回复已安装在 keystore中”说明导入成功。

二、修改配置文件server.xml 将已正确导入认证回复的server.jks文件复制到tomcat安装目录下的conf目用文本编辑器打开Server.xml并更新以下内容

maxThreads="150" SSLEnabled="true" scheme="https" secure="true"

clientAuth="false" sslProtocol="TLS" keystoreFile="D:/jcy/Tomcat7/conf/server.jks"?keystorePass="123456" />

下面为配置文件参数说明: port=”443″?SSL访问端口号为443 keystoreFile 私钥库文件 server.jks keystorePass私钥库密码 123456

对于Tomcat服务器,如果需要支持使用https访问,可以将服务器证书生成以后,配置server.xml文件,开放https访问方式。但有些时候,可能我们需要将整站或者一些特定的URL限制为只能使用https方式进行访问,那么需要在WEB应用的web.xml文件中进行进一步的配置。 在 tomcat /conf/web.xml 中的 后面加上下面代码:

需要重新启动tomcat,命令如下:

service tomcat stop

service tomcat start

备注:

一:Tomcat 默认http端口是8080,https一般默认443端口。修改默认网站端口方法,编辑server.xml修改下面代码:

connectionTimeout="20000"??URIEncoding="UTF-8"

redirectPort="443" />

二:“F5负载均衡产品设备的面板中健康检测还是应该是8080 而不是 443 否则认为不对,导致不能外网访问“,??.jks文件安装所以不需要加keystoreType=”PKCS12″这个代码。

server.xml配置文件参考模板:

type="org.apache.catalina.UserDatabase"

description="User database that can be updated and saved"

factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

pathname="conf/tomcat-users.xml" />

connectionTimeout="20000"??URIEncoding="UTF-8"

redirectPort="443" />

maxThreads="150" SSLEnabled="true" scheme="https" secure="true"

clientAuth="false" sslProtocol="TLS" keystoreFile="D:/jcy/Tomcat7/conf/server.jks" keystoreType="PKCS12" keystorePass="123456" />

resourceName="UserDatabase"/>

unpackWARs="true" >

prefix="localhost_access_log." suffix=".txt"

pattern="%h %l %u %t "%r" %s %b" />

以上由安信SSL证书整理发出,欢迎大家实践测试!

最简单的dockerfile使用教程 – 创建一个支持SSL的Nginx镜像

什么是dockerfile?简单的说就是一个文本格式的脚本文件,其内包含了一条条的指令(Instruction),每一条指令负责描述镜像的当前层(Layer)如何构建。

下面通过一个具体的例子来学习dockerfile的写法。

新建一个dbuild文件夹,创建一个自定义的Nginx首页,逻辑很简单,显示一个自定义的图片文件train.jpg.

未分类

我想基于标准的Nginx镜像做一些修改,让Nginx支持SSL。SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。

为此我首先需要创建一个针对SSL的配置文件。

未分类

cat << '__EOF' > ssl.conf
server {
listen       443 ssl;
server_name  localhost;

ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;

location / {
root   /usr/share/nginx/html;
index  index.html index.htm;
}
}
__EOF

使用如下命令创建nginx.key和nginx.crt文件:

openssl req -x509 -nodes -newkey rsa:4096 -keyout nginx.key -out nginx.crt -days 365 -subj "/CN=$(hostname)"

未分类

一切就绪之后,下面就应该创建dockerfile了:

未分类

FROM nginx:stable

# copy the custom website into the image
COPY train.jpg /usr/share/nginx/html/
COPY index.html /usr/share/nginx/html/

# copy the SSL configuration file into the image
COPY ssl.conf /etc/nginx/conf.d/ssl.conf

# download the SSL key and certificate into the image
COPY nginx.key /etc/nginx/ssl/nginx.key
COPY nginx.crt /etc/nginx/ssl/nginx.crt

# expose the https port
EXPOSE 443

所有dockerfile第一行指令必定是FROM XXXX。

FROM的作用是指定基准镜像。该dockerfile以FROM后面指定的镜像为基础,在其上进行定制。

在 Docker Store 上有很多高质量的官方镜像,主要分为以下三大类:

  1. 开箱即用的服务类的镜像,比如网络服务器nginx ,也有数据库服务器诸如redis 、 mongo 、mysql 等;
  2. 方便开发、构建、运行各种语言应用的镜像,如 node 、 openjdk 、 python 等。
  3. 相对前两大类更为基础的操作系统镜像,如ubuntu 、 debian 、 centos 等

当然您如果不愿意基于这些官方已有镜像开始镜像构建,而是想从头开始,这也是可以的。Docker存在一个特殊的镜像,名为 scratch 。它是一个虚拟的概念,

表示一个空白的镜像。

直接使用FROM scratch 会让镜像体积更加小巧。

接下来的一系列copy指令都很好理解。

dockerfile开发完毕之后,执行命令:

docker build -t jerry-nginx:1.0 .

意思是基于当前目录开始构建镜像,注意末尾的.必不可少,代表“当前目录”。

通过docker build执行输出的日志可以观察到里面每一行的指令被逐行执行:

未分类

最后一行日志提示标签为jerry-nginx:1.0的景象被成功构建。

用下面的命令基于刚刚制作好的镜像运行一个容器:

docker run -d -p 443:443 -p 1082:80 jerry-nginx:1.0

基于http协议访问没有问题:

http://localhost:1082

未分类

基于https访问也能正常工作:

https://localhost:443

未分类

Apache安装SSL证书

1.创建私钥(可选,用于申请证书):

openssl genrsa 2048 > private-key.pem

2.创建证书签名 (CSR,可选):

openssl req -new -key private-key.pem -out csr.pem

3.上传到服务器:

scp ./STAR_yourdomain_com/* yourdomain:/etc/pki/tls/private/

4.合并正规渠道获得的证书:

cat STAR_yourdomain_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > ssl-bundle.crt

5.配置Apache(不再累述详细配置过程):

<VirtualHost *:443>
  ServerName *.yourdomain.com
  SSLEngine on

  SSLCertificateFile /etc/pki/tls/private/STAR_yourdomain_com.crt
  SSLCertificateKeyFile /etc/pki/tls/private/STAR_yourdomain_com.key
  SSLCertificateChainFile /etc/pki/tls/private/ssl-bundle.crt
  SSLCACertificateFile /etc/pki/tls/private/AddTrustExternalCARoot.crt
</VirtualHost>

apache重启时让其自动输入ssl密码

编辑:/etc/httpd/conf.d/ssl.conf

vim ssl.conf

找到:

# SSLPassPhraseDialog builtin

修改成:

SSLPassPhraseDialog exec:/etc/httpd/conf.d/key.sh

创建:key.sh

编辑:/etc/httpd/conf.d/key.sh

vim key.sh

#!/bin/bash

 echo ‘your pass phrase’                          #注意‘’号输入方式

注意key.sh的权限755

重启服务器

问题解决

WordPress一次性搞定ssl全局设置以及潜在问题解决

首先按照自己的项目运行服务器把证书安装好,干货君以腾讯云为例:证书安装指引 – SSL 证书 – 文档平台 – 腾讯云文档平台 – 腾讯云。

干货君使用nginx反向代理,apache作为项目运行服务器为例,修改nginx/conf文件夹下面的nginx.conf(将下方代码块添加到文件中或把文件中443代码块按此方式设置)。

server {
listen 443;
server_name www.nrgh.org; #填写绑定证书的域名
ssl on;
ssl_certificate 1_www.nrgh.org_bundle.crt;
ssl_certificate_key 2_www.nrgh.org.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
ssl_prefer_server_ciphers on;
location / {
#项目路径,或反向代理的代码块
proxy_pass http://nrgh;
} 
}

未分类

上方搞定在nginx.conf中加入下面这个代码块,你要负载均衡(集群使用)也是在这个代码块中搞

upstream www{
#下方写要代理的ip和端口号,下面ip是乱写的,真实的已隐去
server 111.111.205.11:56;
}

未分类

server {
listen 80;
server_name http://www.nrgh.org
if ($scheme = http ) {
#http请求转换为https
return 301 https://$server_name$request_uri;
}
#即所有请求都到这里去找分配
location / {
#全局实现80进来的请求,重定向为https了
proxy_pass http://www;
#rewrite ^/(.*) https://$server_name/$1 permanent;
}
}

上面都配置之后,运行 nginx -t 并重启nginx试试效果

接下来说下会出现的问题:

1、上面都搞定之后,wordpress网站可能出现css和js还是走http请求,文章链接走https请求,这时候需要你把wordpress的媒体文件绝对路径替换相对路径,方法如下:

2、wordpress/wp-admin 后台进不去,登录无反应;

3、百度找了很多解决方法,却依然没有解决,甚至搞的连网站都打不开了;

4、等等。。。

一、系统文件修改

路径:网站根目录wp-includesfunctions.php
找到代码 require( ABSPATH . WPINC . ‘/option.php’ );
在下方添加:

add_filter('script_loader_src', 'agnostic_script_loader_src', 20,2); function agnostic_script_loader_src($src, $handle) { return preg_replace('/^(http|https):/', '', $src); } add_filter('style_loader_src', 'agnostic_style_loader_src', 20,2); function agnostic_style_loader_src($src, $handle) { return preg_replace('/^(http|https):/', '', $src); }

二、后台文件修改

路径:网站根目录wp-config.php
找到代码:

*
* @package WordPress
*/

在下方添加如下代码:

$_SERVER['HTTPS'] = 'on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

三、安装插件

完成以上两步操作后,可以正常访问https开头的网站和后台,
下载这个叫“really-simple-ssl”的WordPress插件:

Really Simple SSL

登录后台安装此插件。

至此,真正意义上解决wordpress全站开启https的ssl证书问题。

LNMP架构 (5) 之 Nginx负载均衡、ssl原理、生成ssl密钥对、配置ssl

1. Nginx负载均衡

Nginx负载均衡就是指 当代理服务器将自定义的域名解析到多个指定IP时,通过upstream模块来保证用户可以通过代理服务器正常访问各个IP(反向代理多台服务器就是负载均衡)。

1.1 负载均衡配置参数

[root@host ~]# vim /usr/local/nginx/conf/vhost/load.conf
upstream qq
#自定义域名
{
    ip_hash;
#目的是为了保证同一个用户始终保持在同一台机器上
#还有就是为了当域名指向多个IP时,保证每个用户始终解析到同一IP
    server 61.135.157.156:80;
    server 125.39.240.113:80;
#指定web服务器的IP
}
server
{
    listen 80;
    server_name www.qq.com;
    location /
    {
        proxy_pass      http://qq;
        proxy_set_header Host  $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

1.2 检测

代理前

[root@host ~]# curl -x127.0.0.1:80 www.qq.com 
This is the default directory.

#没使用代理时,会直接解析到默认的虚拟主机。

代理后

[root@host ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@host ~]# /usr/local/nginx/sbin/nginx -s reload
[root@host ~]# curl -x127.0.0.1:80 www.qq.com
……
#使用代理后,会解析到代理服务器所指向的IP的网页代码

1.3 dig命令

dig命令是常用域名的解析工具,可以寻找域名的全部IP。

如果服务器中没有安装命令

[root@host ~]# yum install -y bind-utils

解析qq网站的全部IP

[root@host ~]# dig www.qq.com

;; ANSWER SECTION:
www.qq.com.        138    IN    A    61.135.157.156
www.qq.com.        138    IN    A    125.39.240.113

;; Query time: 12 msec
;; SERVER: 119.29.29.29#53(119.29.29.29)
;; WHEN: 二 9月 12 22:44:23 CST 2017
;; MSG SIZE  rcvd: 61

2. ssl原理

SSL(Secure Sockets Layer 安//全//套接层)协议,及其继任者TLS(Transport Layer Security传输层安全)协议,是为网络通信提供安全及数据完整性的一种安全协议。

2.1 http、https、tcp

  • HTTP超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。
  • HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),简单讲是HTTP的安全加密版。
  • HTTP默认的端口号为80,HTTPS的端口号为443。
  • TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。默认监听80端口。
  • http是应用层协议, tcp是传输层。 http使用tcp传输文本数据; http只是定义了tcp数据的解析方式

2.2 SSL工作流程

  • 浏览器发送一个https的请求给服务器;
  • 服务器要有一套数字证书,可以自己制作(后面的操作就是阿铭自己制作的证书),也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出>提示页面,这套证书其实就是一对公钥和私钥;
  • 服务器会把公钥传输给客户端;
  • 客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,并用收到的公钥加密;
  • 客户端把加密后的随机字符串传输给服务器;
  • 服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机数后,再用这串随机字符串加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串>通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容);
  • 服务器把加密后的数据传输给客户端;
  • 客户端收到数据后,再用自己的私钥也就是那个随机字符串解密;

3. 生成ssl密钥对

SSL证书就是一对公钥和私钥。

3.1 准备工具

如果虚拟机中没有此工具,手动安装:

[root@host ~]# yum install -y openssl

3.2 创建私钥

[root@host ~]# cd /usr/local/nginx/conf/

[root@host conf]# openssl genrsa -des3 -out tmp.key 2048  //生成SSL密钥
Generating RSA private key, 2048 bit long modulus
....................................................................................+++
...............................................................+++
e is 65537 (0x10001)
Enter pass phrase for tmp.key:
Verifying - Enter pass phrase for tmp.key:   //密钥需要我们设置密码,一般我们都不需要再设置密码,所以要转换一下key,取消密码

[root@host conf]# openssl rsa -in tmp.key -out host.key  //转换一下key,将tmp.key 转换为没密码的host.key

Enter pass phrase for tmp.key:
writing RSA key

[root@host conf]# rm -f tmp.key  //删除tmp.key

3.3 自己生成证书

[root@host conf]# openssl req -new -key host.key -out host.csr   //自己生成证书请求文件,需要拿这个私钥一起生成证书
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:11
State or Province Name (full name) []:BeiJing
Locality Name (eg, city) [Default City]:BeiJing
Organization Name (eg, company) [Default Company Ltd]:BeiJing
Organizational Unit Name (eg, section) []:BeiJing
Common Name (eg, your name or your server's hostname) []:host
Email Address []:zhouqunic@qq.com
#以上是配置证书信息,因为是自己颁发给自己的证书,就随意瞎填或者干脆Enter跳过,如果是正式应用在自己的网站上,最好规范填写。

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:123456

3.4 创建公钥

[root@host conf]# openssl x509 -req -days 365 -in host.csr -signkey host.key -out host.crt  //这里的aminglinux.crt为公钥

Signature ok
subject=/C=11/ST=BeiJing/L=BeiJing/O=BeiJing/OU=BeiJing/CN=host/emailAddress=zhouqunic@qq.com
Getting Private key

4. Nginx配置ssl

4.1 配置文件

[root@host conf]# cd vhost/

[root@host vhost]# vim ssl.conf
server
{
    listen 443;
    server_name zhouqun.com;
    index index.html index.php;
    root /data/wwwroot/zhouquncom;
    ssl on;      //开启ssl
    ssl_certificate host.crt;     //配置公钥
    ssl_certificate_key host.key;        //配置私钥
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;      ///配置协议
}

[root@host vhost]# mkdir /data/wwwroot/zhouqun.com

4.2 检测

[root@host conf]# /usr/local/nginx/sbin/nginx -t
nginx: [emerg] unknown directive "ssl" in /usr/local/nginx/conf/vhost/ssl.conf:7       //报错了
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed

4.3 报错 unknown directive “ssl” 未识别ssl配置,需要重新编译nginx,加上–with-http_ssl_module

[root@host conf]# cd /usr/local/src/nginx-1.12.1/

[root@host nginx-1.12.1]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module  

[root@host conf]# make
[root@host conf]# make install

[root@host nginx-1.12.1]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

[root@host nginx-1.12.1]# /etc/init.d/nginx restart
Restarting nginx (via systemctl):                          [  OK  ]

[root@host nginx-1.12.1]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address          Foreign Address        State      PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*              LISTEN      5991/nginx: master  
tcp        0      0 0.0.0.0:22              0.0.0.0:*              LISTEN      1735/sshd          
tcp        0      0 127.0.0.1:25            0.0.0.0:*              LISTEN      2040/master        
tcp        0      0 0.0.0.0:443            0.0.0.0:*              LISTEN      5991/nginx: master  
tcp6      0      0 :::3306                :::*                    LISTEN      1990/mysqld        
tcp6      0      0 :::22                  :::*                    LISTEN      1735/sshd          
tcp6      0      0 ::1:25                  :::*                    LISTEN      2040/master  

nginx监听80和443端口。

4.4 测试

[root@host nginx-1.12.1]# cd /data/wwwroot/zhouqun.com/

[root@host adai.com]# vim index.html

This is ssl.

4.5 添加本地域名:

[root@host adai.com]# vim /etc/hosts
127.0.0.1  zhouqun.com

[root@host vhost]# curl https://zhouqun.com/
curl: (60) Peer's certificate issuer has been marked as not trusted by the user.
More details here: http://curl.haxx.se/docs/sslcerts.html

curl performs SSL certificate verification by default, using a "bundle"
of Certificate Authority (CA) public keys (CA certs). If the default
bundle file isn't adequate, you can specify an alternate file
using the --cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
the bundle, the certificate verification probably failed due to a
problem with the certificate (it might be expired, or the name might
not match the domain name in the URL).
If you'd like to turn off curl's verification of the certificate, use
the -k (or --insecure) option.

因为该证书是自己创建的,没有符合https组织的规范,不能被正确识别,如果换上正规的证书,就没问题了。

所以,如果要使用浏览器检测,那么进行该测试之前,需要更改Windows的hosts文件,不然就会证书出错的。

Let’s Encrypt配置免费SSL证书建立HTTPS(Ubuntu+Apache)

前言

这段时间在开发微信小程序,需要一个后台服务器,KP小站刚好能够派上用上。不过,微信规定必须使用HTTPS链接,于是按照DigitalOcean的官方教程,利用Let’s Encrypt配置免费SSL简书。过程还是很简单的,虽然遇到了一个小问题,不过Google后也顺利解决了,这里简单分享下心得。

一. 什么是HTTPS?

  1. HTTP表示超文本传输协议(HyperText Transfer Protocol),用来传输客户端(浏览器)和WEB服务器之间的内容。当你访问kplayer.me时,服务器就把html,css,js以及图像等文件通过该协议传输到你的浏览器,你的浏览器解析后就展现主页的内容。

  2. 但是HTTP协议有个问题就是它是明文的,这样就存在安全隐患,如传输内容会被偷窥和窃取;另外在HTTP中通信双方的身份没有进行验证,可能会出现伪装身份的情况,由于任何人都能对服务器发起请求,也使服务器易受DOS攻击;最后客户端无法确定接受报文的完整性,因为中途可能被篡改。

  3. 那么HTTPS呢?它表示HTTP over SSL,其中的S表示SSL:Secure Socket Layer,中文叫“安全套接层”。SSL利用数据加密技术,防止数据在网络传输过程中不会被截取及窃听。它最早为网景公司Netscape所研发,在IETF(国际互联网工程任务组)进行标准化后改名为 TLS(Transport Layer Security),中文叫做“传输层安全协议”,现在我们常能看到二者的合称SSL/TLS。

  4. HTTPS的具体原理是什么?

理解原理之前需要简单介绍几个相关的概念。

4.1 对称密钥和非对称密钥

对称密钥就是客户端和服务器都拥有一把相同的钥匙,用来对报文加解密。打个比方,我有个机密文件想要传给你,但又怕中间被人窃取了,所以我用WinRAR进行口令加密压缩,然后传输给你,你收到文件时输入口令解压即可,这就是对称密钥/口令。但是我怎么安全的告诉你口令是什么呢?至少第一次肯定需要传输口令,这似乎又回到了安全传输的困境,如果这个口令不能安全的传递给你,在过程中被窃取了,那么这种加密方式又有什么意义?

非对称密钥就是加解密使用不同的密钥。那怎么用呢?首先我作为服务器在本地生成一对密钥,一个是公有密钥,一个是私有密钥。我把公有密钥告诉你,你用来进行对文件加密传输,我收到文件后用我的私有密钥进行解密,获得最终文件。相比对称密钥,不必担心密钥的安全传输问题,因为即使公钥被截获,也无法被解密。

4.2 数字摘要与数字签名

有了非对称密钥,有助于客户端和服务端之间的数据不被偷窥和窃取。但是这似乎并不能防止传输的数据被篡改(对于客户端来说),另外如何保证数据是真实服务器发送的而不是被调包过的呢?于是,数字摘要和数字签名技术就被引入了。a) 服务器采用Hash函数对报文生成“摘要”;b) 服务器再用私钥对这个摘要进行加密,作为“数字签名”连同报文发给客户端;c) 客户端收到后,提取数字签名用服务器的公钥进行解密,如果能得到摘要,那说明是真实服务器发送的;d) 客户端再对接收的报文采用与服务器相同的Hash函数处理得到本地摘要,如果与刚刚解密出来的摘要完全一致,那说明报文没有被篡改过。

未分类

4.3 数字证书

有了数字签名,似乎安全性已经得到了保证。真的是这样么?任何存在不可信任风险的地方都有可能被利用。在数字签名中,客户端收到报文后需要用服务器的公钥进行解密,那么如果有不法者偷偷替换了服务器公钥为自己的公钥呢?那么该不法者就可以用自己的私钥生成数字签名发送报文给客户端。因此最大的问题就在于:对于客户端来说,如何确保它所得到的公钥一定是从目标服务器那里发布的,而且没有被篡改过呢?这时候就需要一个权威的第三方机构来统一对外发放公钥,就是所谓的证书权威机构(Certificate Authority, CA),由服务器管理者向CA申请,认证后CA会给服务器管理者颁发“数字证书”(含主机机构名称、公钥等文件),于是服务器在之后发送报文给客户端时只需要加上数字证书即可,客户用CA的公钥验证后就可确认来源的可靠性。

4.4 HTTPS

了解了以上的内容,现在我们来了解下HTTPS的流程:

未分类

a. 客户端使用HTTPS的URL链接向服务器发起请求,如https://kplayer.me;

b. WEB服务器收到请求后将网站的证书信息(含公钥等)发送给客户端;

c. 客户端根据“证书管理器”判断证书是否被冒用,或者公钥是否有效,有问题则发出警告;

d. 如果证书和公钥有效,则客户端首先生成一个随机(对称)数串,并生成客户端版的共享密钥;

e. 客户端再用公钥对数串进行对称密钥加密,之后发送给服务器;

f. 服务器收到这个加密后的随机数串,只需要用私有密钥就能解密出该随机数串;

g. 服务器以随机数串生成服务器端的共享密钥;

h. 至此,客户端和服务端拥有相同共享密钥,则可以利用共享密钥进行安全通信。

从以上流程可以看出HTTPS采用HTTP+SSL的方式使得网站的访问更加安全,但它也使得通信信息量增加,速率降低,消耗更多的服务器资源,而且向认证机构购买证书也是一笔开销,因此在HTTP和HTTPS的选择上要视网站的功能和需求而定。

二、Let’s Encrypt是什么?

SSL证书按大类一般可分为DV SSL、OV SSL、EV SSL证书,也叫做域名型、企业型、增强型证书。

域名型SSL证书(DV SSL):信任等级普通,只需验证网站的真实性便可颁发证书保护网站;

企业型SSL证书(OV SSL):信任等级强,须要验证企业的身份,审核严格,安全性更高;

增强型SSL证书(EV SSL):信任等级最高,一般用于银行证券等金融机构,审核严格,安全性最高,同时可以激活绿色网址栏。

对于个人博客和站点,申请个免费的DV型SSL证书最划算。Let’s Encrypt 是一个免费、开放,自动化的证书颁发机构,由 ISRG(Internet Security Research Group)运作。

https://letsencrypt.org/

ISRG 是一个关注网络安全的公益组织,其赞助商从非商业组织到财富100强公司都有,包括 Mozilla、Akamai、Cisco、Facebook,密歇根大学等等。ISRG 以消除资金,技术领域的障碍,全面推进加密连接成为互联网标配为自己的使命。

三、如何使用Let’s Encrypt配置SSL证书?

官方教程在此:

https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04

1. 安装Let’s Encrypt客户端

a) 新增软件包目录:

sudo add-apt-repository ppa:certbot/certbot

并按回车ENTER确认

b) 更新新增的目录信息

sudo apt-get update

c) 安装官方客户端Cerbot

sudo apt-get install python-certbot-apache

2. 配置SSL证书

sudo certbot –apache -d kplayer.me

根据提示输入对应指令即可,过程中会要求提供Email用于丢失密钥恢复和相关通知,也会让你选择同时启用http和https访问,或者强制所有请求重定向到https。

另外,如果想要证书对对多个域名或子域名有效,可以增加参数,如下(建议第一个是主域名):

sudo certbot –apache -d kplayer.me -d http://www.kplayer.me

如果有多个域名的话,可以多次调用cerbot命令。

安装完成后,可以在浏览器输入以下地址,确认是否成功:

https://www.ssllabs.com/ssltest/analyze.html?d=kplayer.me&latest

成功的话,就可以使用https://kplayer.me来访问小站啦。

不过KP君在执行时收到如下报错信息:

Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA.

一阵Google后,原来由于安全问题,Let’s Encrypt已经停止提供Certbot的Apache和Nginx插件所用的机制,计划在接下来的日子里发布一个新版本的Certbot,如果急需要用的话,可以采用临时的方法:

sudo certbot –authenticator standalone –installer apache -d kplayer.me –pre-hook "systemctl stop apache2" –post-hook "systemctl start apache2"

详情参见:https://github.com/certbot/certbot/issues/5405

3. 验证Certbot自动更新

Let’s Encryp只提供加密90天的证书。然而,我们安装的certbot软件包通过一个systemd定时器每天运行两次certbot进行更新。在非systemd发行版中,此功能由位于/etc/cron.d中的cron脚本提供。 该任务每天运行两次,并将在续期30天内更新。

可以通过如下命令验证:

sudo certbot renew –dry-run

如果没有报错,那就大功告成。如有必要,Certbot将更新证书并重新加载Apache。如果自动更新失败,Let’s Encrypt将向我们提供的电子邮件发送一封邮件,并在证书即将到期时发出警告。

后记

配置完HTTPS,兴奋地在微信小程序后台提交网址,结果提示需要域名备案。在我纠结了一天后,决心乖乖接受监督,可惜在备案的过程中告诉我.me域名暂时无法备案,欲哭无泪,那我就好好的用来写我的博客吧。

注:以上文字和图片部分整理自网络。

nginx 安装 SSL 证书

昨天在腾讯云那里申请了SSL证书,打算部署到服务器上,但是安装过程遇到了问题:

[root@izuf6hed2mdyv56471078kz sbin]# ./nginx -s reload
nginx: [emerg] unknown directive "ssl" in
/usr/local/nginx/conf/nginx.conf:91

于是查看了下nginx的安装信息,发现ssl模块并未被安装:

[root@izuf6hed2mdyv56471078kz sbin]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.11.6
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)
configure arguments:

原因大概是:在安装nginx的时候,没有将ssl模块编译进nginx

解决办法是:重装nginx,并在执行configure命令的时候加得上 –with-http_ssl_module 参数。

由于新的nginx版本已经出来了,就借此机会顺便升级一下吧。

步骤一、下载nginx解压

wget http://nginx.org/download/nginx-1.13.8.tar.gz

# 默认下载到root
cd /root

# 解压
tar xzvf nginx-1.13.8.tar.gz

# 进入解压后的目录
cd nginx-1.13.8

步骤二、安装nginx,并添加ssl模块

./configure --with-http_ssl_module

好吧,又报错了:

./configure: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.

提示我装openssl,好吧,我装。

步骤一点五、安装OpenSSL

这是centos 的安装方法:

yum -y install openssl openssl-devel

好,继续执行步骤二。

步骤二(续)、安装nginx,并添加ssl模块

cd /root/nginx-1.13.8
 ./configure --with-http_ssl_module

请先备份好nginx相关的文件!

请先备份好nginx相关的文件!

请先备份好nginx相关的文件!

然后是安装:

# 网上说这么做会覆盖之前的版本,我测试了下,似乎没有什么大问题...
# nginx.conf也没有变化,若心存疑虑,可以参考其他教程
make install

# 查看版本是否升级
/usr/local/nginx/sbin/nginx -V

步骤三、配置

编辑/usr/local/nginx/conf/nginx.conf 添加配置:

server {
        listen 443 ssl;
        server_name www.zxxblog.cn;
        ssl on;
        ssl_certificate /home/key/1_www.zxxblog.cn_bundle.crt;
        ssl_certificate_key /home/key/2_www.zxxblog.cn.key;
        ssl_session_timeout  5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
        ssl_ciphers  HIGH:!aNULL:!MD5;
        #ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;   
        ssl_prefer_server_ciphers   on;   

        # !! 这下面的是我自己的配置,不同的人可能有所不同 !!
        location / {
            proxy_pass http://localhost:8080;
        }
}

步骤四、重启nginx

# 如果不成功,就kill掉nginx,然后再打开
/usr/local/nginx/sbin/nginx -s reload

然后,我在阿里云的安全组里添加了443端口,搞定!

效果:

未分类

Nginx+SSL+Tomcat+CDN部署总结

之前在度娘搜索资料,无意间看到一些个人站点的博客都用了https协议,在浏览器地址栏中被标记为绿色的“安全”,前些天特地给自己负责的小项目升级成https协议,其优点这里不再赘述,小伙伴们可以自行百度,今天把整合部署分享在这里,希望小伙伴们少走弯路~

效果如下:

未分类

软件版本如下:

未分类

一、生成SSL证书

首先我们创建一个用来存放letsencrypt生成证书项目的路径并进入:

cd /usr/local/letsencrypt

接下来我们克隆letsencrypt项目:

git clone https://github.com/letsencrypt/letsencrypt

开始生成SSL证书:

./letsencrypt-auto certonly --standalone --email test@qq.com -d www.test1.com -d www.test2.com --agree-tos

这里一定注意:

(1). 域名绑定在国内DNS服务器无法生成,需要先将DNS服务器切换到DNS服务商,例如ClouldFlare、Godaddy、Dnsever后才能正常生成!
(2). web服务需要处于关闭状态,注意关闭nginx和80端口的占用!(不间断服务方式生成可以自行百度)
(3). -d 代表domain 可以同时生成多个域名对应证书,生成后我们可以在默认目录中看到:

/etc/letsencrypt/live/www.test.com/
cert.pem(用户证书) 
chain.pem(中间证书) 
fullchain.pem(证书链) 
privkey.pem(证书私钥)

最后我们生成Perfect Forward Security(PFS)键值,具体作用可以自行百度:

mkdir /etc/ssl/private/ -p
cd /etc/ssl/private/
openssl dhparam 2048 -out dhparam.pem

二、Nginx配置SSL证书及Tomcat代理

    #Tomcat 8080端口
    upstream tomcat_8080{
        server    127.0.0.1:8080  weight=1;
    }

    #将所有http协议内容重定向到https协议
    server {
        listen 80;
        server_name www.test.com;
        rewrite ^ https://$server_name$request_uri? permanent;
    }

    #https协议
    server {
        listen 443;
        server_name www.test.com;

        # letsencrypt生成的文件
        ssl on;
        ssl_certificate /etc/letsencrypt/live/www.test.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/www.test.com/privkey.pem;

        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets on;

        ssl_dhparam /etc/ssl/private/dhparam.pem;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        # 一般推荐使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLS
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';
        ssl_prefer_server_ciphers on;

        # 代理tomcat
        location / {   
            proxy_set_header    Host                $http_host;             
            proxy_set_header    X-Real-IP           $remote_addr;     
            proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;     
            proxy_set_header    Cookie              $http_cookie;
            proxy_pass          http://tomcat_8080;
            #proxy_redirect     default;
        }

        access_log /home/wwwlogs/www.test.com_access.log;
        error_log  /home/wwwlogs/www.test.com_error.log;
    }

三、Tomcat的SSL配置

1、Connector节点将redirectPort=”8443″修改为 redirectPort=”443″ proxyPort=”443″最终为:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" proxyPort="443" />

2、找到Engine节点,在最后一个Host标签后加入:

<Host name="www.test.com" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
    <Valve className="org.apache.catalina.valves.RemoteIpValve"
        remoteIpHeader="x-forwarded-for"
        remoteIpProxiesHeader="x-forwarded-by"
        protocolHeader="x-forwarded-proto"/>
    <Context docBase="/www/java/projectName" path="" crossContext="true" debug="3" privileged="true"  reloadable="false" deubt="true" />
</Host>

四、CloudFlare CDN设置(这里很重要)

我们将域名解析到自己服务器后,点击Crypto选项卡,将SSL状态修改为Full(strict)模式,在这种模式下会使用你服务器中的ssl证书,否则会导致页面无限301跳转,导致chrome提示重定向次数过多,请求失败!

WordPress全站添加SSL免费证书开启HTTPS

大家好,最近把achair教程网全站添加了SSL,网址从http://www.xiaored.net,变成了https://www.xiaored.net 前缀变成了https,并且在谷歌浏览器地址栏前面变成了绿色的“安全”,如图:

未分类

简单的说https是安全的http,是经过加密的,百度,淘宝,京东,苹果这些网站都是https的,特别是在线购物的网站建议使用https。下面说说为什么要安装https?

1. 百度搜索排名:
从相关性的角度,百度搜索引擎认为权值相同的站点,采用https协议的页面更加安全,排名上会优先对待。

2. 谷歌浏览器:
从2017年1月份起,Chrome浏览器将会把采用HTTP协议的网站标记为“不安全”网站。

3. 谷歌搜索排名:
谷歌早已宣布采用HTTPS加密协议的网站将会在搜索结果中优先显示。

4. 等等

下面分享下我的网站是如何操作的,先说下我的网站配置以及使用到的工具:

  1. 阿里云ECS的服务器,Nginx

  2. 七牛云的SSL和CDN

  3. WordPress网站,BeTheme主题,Super Cache缓存

  4. DNSPod域名解析,WinSCP服务器管理工具

具体操作经验分享,请到《WordPress公共课》查看:

https://www.xiaored.net/wordpress-commonality/