Hello ,I am KitStar
注意:所有的操作都在Ubuntu32位系统中进行。代码都在终端进行。生成的证书以及KEY将用在Window.
1. 首先创建自己的CA
首先,需要准备一个放置CA文件的目录,包括颁发的证书和CRL。这里我们选择目录为:/var/MyCA.
然后我再在这个目录中建立三个文件。$ mkdir /var/MyCA $ cd /var/MyCA $ mkdir certs private $ chmod g-rwx,o-rwx private $ echo "01" > serial //这个文件用来追踪最后一次颁发的证书ude序列号。初始化为01 $ touch index.txt //这个文件是一个排序数据库,用来跟踪已经颁发的证书。
这第三个文件是Openssl的配置文件也是最重要的文件。如果没有这个文件,将无法给自己的证书签名。
创建文件:
$ touch openssl.cnf
创建完成之后,在文件夹找到这个文件。然后在里面写入配置信息,如下:
[ ca ] default_ca = myca [ myca ] dir = /var/MyCA certificate = $dir/cacert.pem database = $dir/index.txt new_certs_dir = $dir/certs private_key = $dir/private/cakey.pem serial = $dir/serial default_crl_days= 7 default_days = 365 default_md = md5 policy = myca_policy x509_extensions = certificate_extensions // 一下的内容将根据你的项目需求修改。读者在正常使用的时候请删除这句话。 [ myca_policy ] commonName = LiKaiCA stateOrProvinceName = shanghai countryName = cn emailAddress = 774968931@qq.com organizationName= liugankeji organizationalUnitName = SGMWPETH5SERVER [ certificate_extensions ] basicConstraints= CA:false
我们需要告诉Openssl配置文件的历路径。我们通过环境变量设置:
$ OPENSSL_CONF=/var/MyCA/openssl.cnf $ export OPENSSL_CONF
我们需要一个根证书为自己颁发的证书签名,这个证书可以从其他CA获取,或者用自签名的证书。想必大家刚开始都用来测试,所有此处我们用不用第三方去认证。我们自己生成一个自签名的根证书。(当然,浏览器不认的。咱这相当于自己刻了个自己的章子,没有多少可信度以及权威性。别人是不认的。)
首先,还是打开刚才创建的openssl.cnf文件。继续添加一下命令:
[ req ] default_bits = 2048 default_keyfile = /var/MyCA/private/cakey.pem default_md = md5 prompt = no distinguished_name = root_ca_distinguished_name x509_extensions = root_ca_extensions // 一下的内容将根据你的项目需求修改。读者在正常使用的时候请删除这句话。 [ root_ca_distinguished_name ] commonName = LiKaiCA stateOrProvinceName = shanghai countryName = cn emailAddress = 774968931@qq.com organizationName = Root Certification Authority [ root_ca_extensions ] basicConstraints = CA:true
- 好了。现在生成自己的根证书。
$ openssl req -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf
- OK,这时候穿创建了ca.key 以及 ca.crt两个文件。
可以验证一下信息是否正确:
openssl x509 -in ca.crt -text -noout
预留这两个文件。等会为自己的证书进行签名认证。
2. 生成SSL证书
- 首先要生成自己服务器的私钥(key文件):
- 方法一:创建没有密码保护的(1024也可以是2048)
$ openssl genrsa -out server.key 1024 (with out password protected)
- 方法二:创建又密码保护的
$ openssl genrsa -des3 -out server.key 1024 (password protected)
- 注意:如果用方法二创建的key.则在每次访问服务器的时候都需要输入密码。如果觉得不方便可以用一下命令去除这个密码验证。
$ openssl rsa -in server.key -out server.key
- 方法一:创建没有密码保护的(1024也可以是2048)
创建CSR文件:
$ openssl req -new -out server.csr -key server.key
注意:如果无法创建,有可能是权限不够。
然后终端就是出现一些用户信息列表,需要你自己填入:
Country Name (2 letter code) [AU]:cn State or Province Name (full name) [Some-State]:shanghai Locality Name (eg, city) []:shanghai Organization Name (eg, company) [Internet Widgits Pty Ltd]:liugankeji Organizational Unit Name (eg, section) []:SGMWPETH5SERVER Common Name (eg, YOUR name) []:192.168.1.69 注释:一定要写服务器所在的ip地址 Email Address []:774968931@qq.com
3. 最后,用生成的CA证书为刚才的server.csr文件签名,生成对应的 server.crt 文件
$ openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA ../ca.crt -CAkey ../ca.key -CAcreateserial -days 3650
OK,打完收工。现在把你的生成的server.key 和 server.crt 文件传到window文件夹中。
4,在Tornado网站中开启HTTPS
- 剩下的就简单了。在你的项目中添加server.key 和 server.crt 文件。并且修改对应的代码:
import os.path
from tornado import httpserver
from tornado import ioloop
from tornado import web
class TestHandler(web.RequestHandler):
def get(self):
self.write("Hello, World!")
def main():
settings = {
"static_path": os.path.join(os.path.dirname(__file__), "static"),
}
application = web.Application([
(r"/", TestHandler),
], **settings)
server = httpserver.HTTPServer(application, ssl_options={
"certfile": os.path.join(os.path.abspath("."), "server.crt"),
"keyfile": os.path.join(os.path.abspath("."), "server.key"),
})
server.listen(8000)
ioloop.IOLoop.instance().start()
if __name__ == "__main__":
main()
然后把相关的证书扔到 py 文件的目录下。改成相应的名字。然后开启服务。
接着用浏览器或curl啥的尝试访问一下: curl https://localhost:8000
看到请求返回的 Hello, World! 了么? 当然…..
不行了。因为浏览器没有这个server.crt证书。就算你导入,也不行。因为咱的这个证书啊。不是权威机构签名认证的,是刚才自己用自己创建的CA进行认证的
5. 为U3D 的安卓应用进行Https访问进行准备
如果将要用在U3D 客户端进行对服务器的访问。则还要生成相应的客户端的证书:“client.p12”。不然的的话。U3D 打包出来只能用在PC 端。安卓以及苹果将没法使用。
1.创建私钥 :
C:/OpenSSL/bin>openssl genrsa -out client/client-key.pem 1024
2.创建证书请求 :
C:/OpenSSL/bin>openssl req -new -out client/client-req.csr -key client/client-key.pem
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:shanghai
Locality Name (eg, city) []:shanghai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:liugankeji
Organizational Unit Name (eg, section) []:SGMWPETH5SERVER
Common Name (eg, YOUR name) []:Client
Email Address []:Client //注释:就是登入中心的用户(本来用户名应该是Common Name,但是中山公安的不知道为什么使用的Email Address,其他版本没有测试)
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:liugankeji
3.自签署证书 :
C:/OpenSSL/bin>openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey client/client-key.pem -CA ../ca.crt -CAkey ../ca.key -CAcreateserial -days 3650
4.将证书导出成浏览器支持的.p12格式 :
C:/OpenSSL/bin>openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey client/client-key.pem -out client/client.p12
具体U3D 安卓中的操作在下一篇文章中:U3D 安卓通过openssl创建的电子证书进行HTTPS 加密访问
友谊链接:
openssl制作证书全过程
使用Tornado搭建HTTPS网站
使用OpenSSL生成证书
·