自签名SSL证书

Categories: HTTP

现在大家对互联网安全越来越重视了,Chrome、Safari等浏览器更是直接把http请求的网站标记为不安全网站,还有IOS应用直接就关闭了http的请求,只支持https。所以现在越来越多的网站、服务都开始使用https进行加密传输。

HTTPS

https其实就是http基础上加了SSL协议,通过SSL数字证书来进行服务器身份认证和通信的加密。所以我们的服务或者网站要升级到https就需要有SSL数字证书。数字证书中的公钥能够和服务器上的私钥配对使用,实现数据传输过程中的加密和解密。

CA

这个数字证书其实大家都可以自己生成的,既然这样,我们访问某个网站咋知道这个网站是别人伪造的还是真的?这时候“权威”机构就出来了,就是常说的CA(数字证书签发机构)专门签发证书的第三方机构,你作为网站主到这个第三方机构去申请证书,CA确认你的申请信息无误后就会给你颁发证书,这个证书浏览器接收到后因为是“权威”结构颁发的所以会认为是安全的、可信任的。

自签名证书

CA证书需要“权威”机构颁发,既然是“权威”的,价格就不菲,对很多人来说是笔很大的开销。但是为了数据传输的安全性,我们内部使用的服务还是可以用自签名证书来开启https协议的。就是前面说的自己通过一些工具生成的数字证书,来进行数据传输的加密解密。

一般数字证书可以用openssl工具生成

生成私钥

server.key:

$ openssl genrsa -des3 -out server.key 2048

这个私钥文件,用于服务端对发送给客户端数据的加密和从客户端接收到的数据进行解密,这里生成私钥的时候会要求你输入一个密码。

生成证书签名请求文件

server.csr:

$ openssl req -new -key server.key -out server.csr

通过私钥生成签名请求文件,这里会要你填写请求者的身份信息,如下:

Country Name (2 letter code) []: CN
State or Province Name (full name) []: 省份
Locality Name (eg, city) []: 城市
Organization Name (eg, company) []:公司名称
Organizational Unit Name (eg, section) []: 单位名称
Common Name (eg, fully qualified host name) []: 这里要写你的域名,比如www.muliba.net
Email Address []:你的邮箱

生成自签名证书

前面生成私钥server.key文件的时候有一个密码,这里先把这个密码删除了,因为如果有密码在,每次重启apache或者Nginx的时候是需要输入密码的。

$ openssl rsa -in server.key -out server_nopwd.key

然后生成一个自签名证书:

$ openssl x509 -req -days 365 -in server.csr -signkey server_nopwd.key -out server.crt

OK,这样自签名证书就制作完成了,然后只要将server_nopwd.keyserver.crt这两个文件配置到你的apache或者Nginx服务器上就行了。

jks文件

如果你是用的上面说的apache和Nginx这样的web服务器,上面的两个文件就可以了。但是如果你用的是tomcat或jetty这类java写的应用服务器,想启用https服务,就需要生成java keystore文件。它其实内部也是包含了私钥文件和证书文件。

这个keystore文件生成需要用java的keytool工具。

$ keytool -genkey -alias 别名 -keyalg RSA -keystore keystore.jks -keysize 2048

跟上面生成私钥和证书一样,这个命令也会要你输入密码,还有申请者的信息等

Enter keystore password:
Re-enter new password:
What is your first and last name?
  [Unknown]:  填写网站域名
What is the name of your organizational unit?
  [Unknown]:  单位
What is the name of your organization?
  [Unknown]:  公司
What is the name of your City or Locality?
  [Unknown]:  城市
What is the name of your State or Province?
  [Unknown]:  省份
What is the two-letter country code for this unit?
  [Unknown]:  CN

生成的这个jks文件就可以用于java应用服务器开启https服务了。

The End !