前言
最近需要使用https搭建一個api 故簡單記錄一下搭建過程
搭建http的服務簡單快捷,這里就不做其他介紹
有關https的原理 請參考
圖解HTTPS
環境搭建(非必須)
這個環境其實不是必須的,我再搭建的時候,并沒有安裝這個環境,因為我的linux服務器自帶的有了,可能 是在安裝其他軟件的時候再帶安裝上去了,所以可以自我檢測一下。
一、 安裝OpenSSL
-
OpenSSL 介紹
OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議,并提供豐富的應用程序供測試或其它目的使用。
SSL是Secure Sockets Layer(安全套接層協議)的縮寫,可以在Internet上提供秘密性傳輸。SSL能使用戶/服務器應用之間的通信不被攻擊者竊聽,并且始終對服務器進行認證,還可選擇對用戶進行認證。SSL協議要求建立在可靠的傳輸層協議(TCP)之上。 -
OpenSSL 安裝
安裝openssl$ sudo apt-get install openssl
安裝openssl開發庫
$ sudo apt-get install libssl-dev
編輯器使用 bless 十六進制編輯器,需預先安裝
$ sudo apt-get install bless
-
獲取 openssl.cnf (必須步驟)
去這個目錄下 /usr/lib/ssl/openssl.cnf 拷貝出 openssl.cnf
這是 openssl 的配置文件,下面生成證書及簽名的時候 我們將用到這個文件
可能不同的os 此文件的位置不同,我的目錄是在 /etc/pki/CA/
openssl
.
cnf簡單釋義
vi
/
usr
/
lib
/
ssl
/
openssl
.
cnf
127
[
req_distinguished_name
]
128
countryName
=
Country
Name
(
2
letter code
)
##國家名,
2
個字母代碼簡稱
129
countryName_default
=
CN
##中國就是
CN
130
countryName_min
=
2
131
countryName_max
=
2
132
133
stateOrProvinceName
=
State or Province
Name
(
full name
)
##州或省的名字
134
stateOrProvinceName_default
=
beijing
135
136
localityName
=
Locality
Name
(
eg
,
city
)
##本地城市名
137
localityName_default
=
beijing
138
0.
organizationName
=
Organization
Name
(
eg
,
company
)
##
組織
(
公司
)
名
139
0.
organizationName_default
=
beijing www company
140
145
organizationalUnitName
=
Organizational Unit
Name
(
eg
,
section
)
##
組織單元
(
部門
)
名
146
organizationalUnitName_default
=
www
147
148
commonName
=
Common
Name
(
e
.
g
.
server
FQDN
or
YOUR
name
)
##服務器域名
149
commonName
=
www
.
baidu
.
com
150
commonName_max
=
64
151
152
#emailAddress
=
Email Address ##Email地址
153
emailAddress
=
admin@baidu
.
com
154
emailAddress_max
=
64
155
156
#
SET
-
ex3
=
SET
extension number
3
157
158
[
req_attributes
]
159
#challengePassword
=
A
challenge password ##修改密碼
160
challengePassword
=
161
163
challengePassword_min
=
4
164
challengePassword_max
=
20
二、 安裝Tornado
Tornado是目前python一個非常留下的非阻塞式服務器框架
若想了解更多,請參考
官方文檔(中文版)
安裝命令:
sudo
pip
install
tornado
Tornado 本身支持 SSL ,所以我們這里需要做的主要是生成可用的證書。
三、生成證書
生成SSL證書
首先要生成服務器端的私鑰(key文件)
$ openssl genrsa -des3 -out server.key 1024
生成CSR文件
將之前的openssl.cnf 拷貝到所需目錄中
$ openssl req -new -key server.key -out server.csr -config openssl.cnf
生成Certificate Signing Request(CSR),生成的csr文件交給CA簽名后形成服務端自己的證書.屏幕上將有提示,依照其指示一步一步輸入要求的個人信息即可.
對客戶端也作同樣的命令生成key及csr文件:
$ openssl genrsa -des3 -out client.key 1024
$ openssl req -new -key client.key -out client.csr -config openssl.cnf
CSR文件必須有CA的簽名才可形成證書.可將此文件發送到verisign等地方由它驗證,要交一大筆錢,何不自己做CA呢.
在bin目錄下新建目錄 demoCA、demoCA/certs、demoCA/newcerts
在demoCA建立一個空文件 index.txt
在demoCA建立一個文本文件 serial, 沒有擴展名,內容是一個合法的16進制數字,例如 0000
這里說明一下,在我的目錄下 /etc/pki/CA/ 已經存在了這些certs文件夾,所以只需要在這個文件下新建index.txt, serial即可
openssl req
-
new
-
x509
-
keyout ca
.
key
-
out ca
.
crt
-
config openssl
.
cnf
用生成的CA的證書為剛才生成的server.csr,client.csr文件簽名:
$ openssl ca
-
in
server
.
csr
-
out server
.
crt
-
cert ca
.
crt
-
keyfile ca
.
key
-
config openssl
.
cnf
$ openssl ca
-
in
client
.
csr
-
out client
.
crt
-
cert ca
.
crt
-
keyfile ca
.
key
-
config openssl
.
cnf
ok,到了這里應該已經創建了可以使用的證書了,如果在為文件簽名的時候有錯誤,那多半是信息不正確,這時可以去清空一下 index.txt 里的信息,然后重新執行第5步里失敗的操作。
在Tornado網站中開啟HTTPS
接著可以測試一下 tornado 使用 ssl 的證書了。
寫個測試項目,其實也就一個py文件,像:
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"
)
,
#我的代碼是吧.改成了/home/SSLCertificate,其他不變
}
)
server
.
listen
(
8000
)
ioloop
.
IOLoop
.
instance
(
)
.
start
(
)
if
__name__
==
"__main__"
:
main
(
)
然后把相關的證書扔到 py 文件的目錄下。改成相應的名字。然后開啟服務。
接著用使用 curl
curl
-
k https
:
/
/
localhost
:
8000
-k 是跳過驗證
看到請求返回的 Hello, World! 了么?恭喜你~你成功了~
至于后面務端會出現服 Enter PEM pass phrase ,請參考我的另外一篇博客解決服務器每次都要輸入Enter PEM pass phrase
參考:
http://www.yeolar.com/note/2015/04/30/tornado-ssl-https/
https://www.jianshu.com/p/5880ae1cd595
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
