1. 程式人生 > >信安實踐——自建CA證書搭建https伺服器

信安實踐——自建CA證書搭建https伺服器

1.理論知識

https簡介

HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。

超文字傳輸協議HTTP協議被用於在Web瀏覽器和網站伺服器之間傳遞資訊。HTTP協議以明文方式傳送內容,不提供任何方式的資料加密,如果攻擊者截取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的資訊,因此HTTP協議不適合傳輸一些敏感資訊,比如信用卡號、密碼等。

為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文字傳輸協議HTTPS。為了資料傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證伺服器的身份,併為瀏覽器和伺服器之間的通訊加密。

HTTPS和HTTP的區別主要為以下四點:

  • https協議需要到ca申請證書,一般免費證書很少,需要交費。
  • http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議。
  • http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
  • http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。

簡單的說,https就是在http的基礎上巢狀SSL協議,由此來實現身份認證,要理解SSL,還要說明一下非對稱加密體系。

非對稱加密

有非對稱加密,那麼當然也有對稱加密,下面簡單說一下這兩者的區別。

  • 對稱加密:指的是加密和解密使用的是同一個金鑰,傳送者使用祕鑰A對資訊加密,然後傳送密文,接受者使用金鑰A對密文解密,得到資訊。若此時使用金鑰B解密此密文,則無法進行解密。為了保證加密的可靠性,傳送者和接受者都要保證金鑰A不被洩露。
  • 非對稱加密:使用一對金鑰進行加密和解密操作,分別稱為公鑰和私鑰,公鑰和私鑰是成對生成的,公鑰往往是公開的,任何人都可以得到,私鑰是保密的,只有特定的人才擁有。非對稱加密有兩種典型的使用情況,分別是加密驗證

下面簡單介紹加密與驗證。
加密:

  • 加密是為了傳送需要保密的資訊,所以需要保證只有特定的人才可以對資訊進行解密。
  • 傳送者使用公鑰A加密,接受者使用私鑰A解密。假設所有人都擁有公鑰A,只有張三有私鑰A,那麼,其他人想要給張三傳送資訊,只需要將資訊使用公鑰A加密,那麼密文只有擁有私鑰A的張三才可以解密。

驗證:

  • 驗證是為了向其他人證明“我就是我”的問題。
  • 在這裡,傳送者使用私鑰進行A簽名,接受者使用公鑰A進行驗證。還是假設所有人都擁有公鑰A,只有張三有私鑰A,現在張三要向其他人證明自己就是張三,於是張三將“我是張三”這段資訊使用私鑰A進行簽名,傳送給其他人,其他人使用公鑰A解密,得到簽名“我是張三”,於是其他人就認為這段資訊是張三傳送的。
  • 這裡有一個問題,就是任何人都可以使用自己的私鑰將“我是張三”簽名,從而仿冒張三,假設此時有一個李四,他用自己的私鑰B簽名“我是張三”,這使其他擁有公鑰B的人會認為李四就是張三。
  • 解決這個問題的方法就是引入有足夠公信力的第三方,由第三方負責驗證誰是誰的問題(就像我們使用公安局簽發的身份證就可以證明自己是自己)。張三為了證明自己是張三,他會將“我是張三”傳送給第三方,第三方用自己的私鑰C將驗證資訊加密(這就是簽名),將加密後的簽名返回給張三,以後張三就會使用這個簽名來證明自己是張三。其他人只會只用第三方的公鑰對簽名進行驗證。這是如果李四要仿冒自己是張三,他用自己私鑰B加密後的驗證資訊,其他人用第三方的公鑰C是無法解密的。
  • 在https中,CA就是這個第三方,CA(Certificate Authority),也稱為電子商務認證中心,是負責發放和管理數字證書的權威機構,並作為電子商務交易中受信任的第三方,承擔公鑰體系中公鑰的合法性檢驗的責任。CA具體流程下面再說。

https建立流程

首先上圖,這張圖顯示了https建立的流程。

下面簡單解釋一下這個流程:

  • CA建立,並頒發給自己根證書。即CA使用自己的私鑰,將CA的驗證資訊和自己的公鑰打包加密成根證書。
  • CA與瀏覽器廠商(browser vendor)聯絡,告訴瀏覽器廠商自己的證書,如果瀏覽器廠商信任這個CA,就會把這個CA的證書加入到自己開發的瀏覽器中。
  • 一個想要獲取https服務的網站,首先要將自己的驗證資訊和自己的公鑰傳送給CA,並向CA申請自己的證書,CA在驗證這個網站的合法性之後,會用CA自己的私鑰對網站的驗證資訊和公鑰打包加密,形成這個網站的證書,並將這個證書頒發給網站。
  • 現在網站已經有了自己的證書了,於是他可以搭建自己的https服務。
  • 現在一個客戶端要使用網站的https服務,網站會將自己的證書傳送給客戶端。客戶端使用CA的證書對網站證書進行驗證,核實無誤後建立安全連線,即SSL握手過程
    • 由客戶端開始。客戶端傳送SSL版本,以及加密和壓縮演算法給伺服器。伺服器檢查是否支援此版本SSL,並啟動客戶端期望的加密和壓縮演算法。
    • 基礎配置完畢後,伺服器傳送自己的證書。該證書必須被客戶端信任,或者被客戶端信任的CA所信任。
    • 客戶端驗證證書,並核實伺服器的身份是正確的。
    • 驗證完畢後,兩者協商之後使用的加密方式,並且客戶端告訴伺服器,從現在起,所有資料互換都是加密的,併發送一個加密的驗證”訊息“給伺服器。
    • 伺服器驗證是客戶端傳送的,並且”訊息“可以被解密。伺服器將解密後的”訊息“傳送給客戶端。客戶端核實後,安全連線。握手結束。
  • 之後,客戶端和伺服器可以使用https服務進行加密通訊了,不過之後的通訊一般使用對稱加密演算法來實現,因為相較於非對稱加密,對稱加密所佔資源更少。

2.搭建https服務

本機環境:Ubuntu 17.10 , Openssl 1.0.2g , FireFox 57.0.1 (64 位) , Apache 2.4.27

首先確認安裝OpenSSL

確定OpenSSL版本:

$openssl version

如果版本低於1.0.1f,建議升級,因為1.0.1f版本之下的OpenSSL有一個Heartbleed漏洞。
安裝OpenSSL:

$sudo apt-get install openssl

自建CA

因為向CA申請簽名是需要收費的,所以我們選擇自己搭建一個CA來完成這個實驗過程。
首先建立myCA目錄用於存放CA相關資訊

cd && mkdir -p myCA/signedcerts && mkdir myCA/private && cd myCA

myCA 用於存放 CA 根證書,證書資料庫,以及後續伺服器生成的證書,金鑰以及請求
signedcerts:儲存簽名證書的 copy
private: 包含私鑰

之後配置myCA相關引數,在myCA目錄下進行

echo '01'>serial && touh index.txt

然後建立 caconfig.cnf 檔案

vim ~/myCA/caconfig.cnf

caconfig.cnf檔案內容如下

# My sample caconfig.cnf file.
#
# Default configuration to use when one is not provided on the command line.
#
[ ca ]
default_ca      = local_ca
#
#
# Default location of directories and files needed to generate certificates.
#
[ local_ca ]
dir             = /home/<username>/myCA                    # 這裡要將username替換為你的使用者名稱
certificate     = $dir/cacert.pem
database        = $dir/index.txt
new_certs_dir   = $dir/signedcerts
private_key     = $dir/private/cakey.pem
serial          = $dir/serial
#       
#
# Default expiration and encryption policies for certificates.
#
default_crl_days        = 365
default_days            = 1825
default_md              = SHA256
#       
policy          = local_ca_policy
x509_extensions = local_ca_extensions
#       
#
# Default policy to use when generating server certificates.  The following
# fields must be defined in the server certificate.
#
[ local_ca_policy ]
commonName              = supplied
stateOrProvinceName     = supplied
countryName             = supplied
emailAddress            = supplied
organizationName        = supplied
organizationalUnitName  = supplied
#       
#
# x509 extensions to use when generating server certificates.
#
[ local_ca_extensions ]
subjectAltName          = DNS:localhost
basicConstraints        = CA:false
nsCertType              = server
#       
#
# The default root certificate generation policy.
#
[ req ]
default_bits    = 2048
default_keyfile = /home/<username>/myCA/private/cakey.pem  # 這裡要將username替換為你的使用者名稱
default_md      = SHA256
#       
prompt                  = no
distinguished_name      = root_ca_distinguished_name
x509_extensions         = root_ca_extensions
#
#
# Root Certificate Authority distinguished name.  Change these fields to match
# your local environment!
#
[ root_ca_distinguished_name ]
commonName              = MyOwn Root Certificate Authority # CA機構名
stateOrProvinceName     = JS                               # CA所在省份
countryName             = CN                               # CA所在國家(僅限2個字元)
emailAddress            = [email protected]                     # 郵箱
organizationName        = XXX                              # 
organizationalUnitName  = XXX                              # 
#       
[ root_ca_extensions ]
basicConstraints        = CA:true

生成 CA 根證書和金鑰

export OPENSSL_CONF=~/myCA/caconfig.cnf       #該命令用於給環境變數 OPENSSL_CONF 賦值為caconfig.cnf。
openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825             # 生成 CA 根證書和金鑰

該命令需要使用者設定密碼。不要忘記。
以上步驟生成了 CA 自簽名根證書,和 RSA 公/私金鑰對。證書的格式是 PEM,有效期是1825天。

  • /myCA/cacert.pem: CA 根證書
  • /myCA/private/cakey.pem: CA 私鑰

建立伺服器公私鑰

生成伺服器配置檔案exampleserver.cnf

vim ~/myCA/exampleserver.cnf

exampleserver.cnf檔案內容如下

#
# exampleserver.cnf
#

[ req ]
prompt             = no
distinguished_name = server_distinguished_name

[ server_distinguished_name ]
commonName              = localhost          # 伺服器域名
stateOrProvinceName     = JS                 # 伺服器所在省份
countryName             = CN                 # 伺服器所在國家(僅限2個字元)
emailAddress            = [email protected]       # 郵箱
organizationName        = XXX                # 
organizationalUnitName  = XXX                # 

生成伺服器證書和金鑰

export OPENSSL_CONF =~/myCA/exampleserver.cnf   # 該命令設定環境變數 OPENSSL_CONF,使得 openssl 更換配置檔案。
openssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM

同樣的,需要輸入密碼短語。
之後,有2種對臨時祕鑰的操作,選擇其一即可
1.將臨時私鑰轉換為 unencrypted key,即祕鑰不加密狀態。

penssl rsa -in tempkey.pem -out server_key.pem

需要輸入密碼短語。

2.如果希望將 key 保持為加密狀態,直接改名

mv tempkey.pem server_key.pem

兩者的區別是,第二種需要在伺服器啟動時輸入私鑰的密碼短語,否則會導致伺服器啟動失敗,但第二種安全性高於第一種,可以更好的保護祕鑰。

使用 CA key 對伺服器證書籤名

export OPENSSL_CONF=~/myCA/caconfig.cnf
openssl ca -in tempreq.pem -out server_crt.pem

這裡提示:

Can't open /home/shawn/myCA/index.txt.attr for reading, No such file or directory
140344032040704:error:02001002:system library:fopen:No such file or directory:crypto/bio/bss_file.c:74:fopen('/home/shawn/myCA/index.txt.attr','r')
140344032040704:error:2006D080:BIO routines:BIO_new_file:no such file:crypto/bio/bss_file.c:81:

是Openssl的bug,在myCA目錄下再touch一個index.txt.attr即可

刪除臨時證書和密碼檔案

rm -f tempkey.pem && rm -f tempreq.pem

現在,自簽名的伺服器證書和金鑰對便產生了:

  • server_crt.pem : 伺服器證書檔案
  • server_key.pem : 伺服器金鑰檔案

Apache 服務端配置

證書準備好之後,我們要對服務端程式進行配置,讓它支援 HTTPS。這裡我給大家以 CentOS 7 作業系統, Apache 2.x 服務端程式為例。

需要安裝httpd,mod_ssl。

yum install httpd mod_ssl

Apache 的 HTTPS 配置檔案一般在 /etc/httpd/conf.d/ssl.conf 這個位置。 用 vim 編輯器開啟它, 然後加入這樣一個節點:

<VirtualHost *:443>
    SSLEngine On
    SSLCertificateFile /home/shawn/myCA/server_crt.pem
    SSLCertificateKeyFile /home/shawn/myCA/server_key.pem
    SSLCACertificateFile /home/shawn/myCA/cacert.pem

    ServerAdmin [email protected]
    ServerName yoursite.com
    DocumentRoot /var/www/html/
</VirtualHost>

這裡用到了我們前面準備的證書和祕鑰。 SSLCertificateFile 是你站點的證書, SSLCACertificateFile 是根證書, SSLCertificateKeyFile 是隻儲存在你伺服器的私鑰。

有了這些資訊後,Apache 就可以正確的處理 HTTPS 請求了。 在這之前我們還需要在做最後一步操作, 編輯 /etc/httpd/conf/httpd.conf 檔案, 這個是 Apache 的主配置檔案, 加入這樣一行:

  1. Listen 443 

這個是讓你的服務端同時監聽 443 埠。 因為 HTTPS 的預設埠是 443, 所以這個設定是必須要有的。

一切都就緒後,重啟你的伺服器:

  1. systemctl restart httpd 

然後再用瀏覽器輸入 https://yoursite.com 訪問你的站點時,就應該可以看到 HTTPS 驗證成功的小鎖頭了。

防火牆設定

如果配置都就緒,你重啟了之後,依然不能正常訪問,有可能是你的防火牆把 443 埠攔截了,把它開啟:

  1. iptables -A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
  2. iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT

相關推薦

實踐——CA證書搭建https伺服器

1.理論知識https簡介HTTPS(全稱:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全為目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。超文字傳輸協

CA證書搭建https伺服器

由於CA收費,所以可以自建CA,通過將CA匯入瀏覽器實現https的效果,曾經12306購票就需要自行匯入網站證書。 關於https 2015年阿里巴巴將旗下淘寶、天貓(包括移動客戶端)全站啟用HTTPS加密,並順利通過“雙十一”考驗,成為全球最大的電商平臺全站HTTPS改造案例。 全站HTTPS需要解決3大

Https、OpenSSLCA證書及簽發證書、nginx單向認證、雙向認證及使用Java訪問

1.5 image echo create etc 保存 config openss ima 0.環境 安裝了nginx,安裝了openssl 1.配置和腳本 先創建一個demo目錄(位置自己選擇,我選擇建在nginx的目錄下): mkdir /etc/nginx/

使用OpenSSLCA + Nginx配置HTTPS

ble not cer per see 當前目錄 認證 ner web Ubuntu 16.04(ECS),OpenSSL 1.0.2g 1 Mar 2016,Nginx 1.10.3 (Ubuntu), 瀏覽器:Chrome 67,Firefox 61,Edge 40,

小程式開發(6) SSL證書HTTPS伺服器

1. 域名 在萬網購買,略 2. 雲伺服器 阿里雲購買,略 3. 安裝lnmp 使用lnmp.org程式,略 4. 申請證書 阿里雲-管理控制檯-安全(雲盾)-證書服務-購買證書證書型別: 免費型DV SSL選擇品牌: Symantec 購買成功後,繫結域名,配置DNS解析

CA證書申請

linux自建ca和證書頒發CA簡介:CA是負責簽發證書、認證證書、管理已頒發證書的機關。它要制定政策和具體步驟來驗證、識別用戶身份,並對用戶證書進行簽名,以確保證書持有者的身份和公鑰的擁有權。網上的公眾用戶通過驗證 CA 的簽字從而信任 CA ,任何人都可以得到 CA 的證書(含公鑰),用以驗證它所簽發的證

CA 中心並簽發 CA 證書

目錄 文章目錄 目錄 CA 認證原理淺析 基本概念 PKI CA 認證中心(證書籤發) X.509 標準 證書 證書的簽發過程 自建 CA 簽發證書並認證 HT

linux中證書搭建https

前言          搭建https有兩種方式,分為單向認證和雙向認證。單向認證就是傳輸的資料加密過了,但是不會校驗客戶端的來源,也就只有客戶端驗證服務端證書。 搭建https  1.生成單向認證的https證書 建立伺服器私鑰,生成RSA祕鑰。過程中會要求輸入密碼,

OpenSSL CA及簽發證書

利用 OpenSSL 建立 CA 及自行簽發證書。 1. 建立CA目錄結構 在CA的配置檔案中,有說明預設CA的目錄。 建立預設CA下的目錄及檔案如下圖(.old檔案和.attr檔案是簽發證書後自動生成的檔案)。 其中, newcert

CA 頒發證書

原文地址: http://blog.csdn.net/erice_e/article/details/53486071 客戶端認證伺服器: 正規的做法是:到國際知名的證書頒發機構,如VeriSign申請一本伺服器證書,比如支付寶的首頁,點選小鎖的圖示,可以看到支付

使用CA簽名證書搭建HTTPS網站

在自己倒騰https網站的時候用自定義的CA給自己的網站做自簽名的問題一直困擾了我好久,下面是我自己測試成功的案例,網上有很多類似的問題,在這裡儲備一份供自己和他人蔘考使用。 1. 安裝linux,apache,openssl元件,在此不做贅述,我用的就是

CA與簽發證書

CA 簡介 在加密中,證書頒發機構或證書頒發機構(CA)是頒發數字證書的實體。數字證書通過證書的指定主題來證明公鑰的所有權。這允許其他人(依賴方)依賴簽名或關於與經認證的公鑰對應的私鑰的斷言。CA充當受信任的第三方 -由證書的主體(所有者)和依賴證書的一

基於 OpenSSL CA 和頒發 SSL 證書

原文地址 https://deepzz.com/post/based-on-openssl-privateCA-issuer-cert.html#toc_5自建 CA 頒發證書不僅可以用來鑑權,而且使你的通訊更加的安全(請保護好你的證書)。在實際的軟體開發中,越來越多的服務用到 HTTPS,證書的需求隨之增加

基於OpenSSLCA和頒發SSL證書

openssl是一個開源程式的套件、這個套件有三個部分組成:一是libcryto,這是一個具有通用功能的加密庫,裡面實現了眾多的加密庫;二是libssl,這個是實現ssl機制的,它是用於實現TLS/SSL的功能;三是openssl,是個多功能命令列工具,它可以實現加密解密,甚至還可以當CA來用,可以讓你建立證

opensslCA及生成證書

檢視openssl版本 openssl version 使用openssl加密和解密檔案 加密檔案 opnessl有一個子命令enc,他可以用來加密檔案,具體引數如下: -ciphername:指定加密演算法 -in fil

CA認證和證書

一些概念: PKI:Public Key Infrastructure 簽證機構:CA(Certificate Authority) 註冊機構:RA(Register Authority) 證書吊銷列表:CRL(Certificate Revoke L

部署CA頒發證書實現https加密

isp pan ef6 span med _for logs strong 執行 理論忽略:百度上很多 需求:自建證書並實現域名的https加密 部署: 在linux機器上執行以下命令生成私鑰 mkdir -p /opt/ssl-cert cd /opt/ssl

HTTPSCA證書 && nginx配置https服務

什麽 serve 其中 keepalive 構建 root openss nginx配置 {}   首先,搭建https服務肯定需要一個https證書。這個證書可以看做是一個應用層面的證書。之所以這麽說是因為https證書是基於CA證書生成的。對於正式的網站,CA證書需要到

CA實驗

openssl 證書頒發 ... crt pki attr .com 詳細 gen 測試主機:172.20.112.128(centos6.9:c6) 172.20.112.162(CA,centos7:c7)[root@c7 ~]# vi /etc/pki/tls/o

(13) openssl ca(簽署和CA)

多選 bject 自建 stat ddr new eba 不重復 重新 用於簽署證書請求、生成吊銷列表CRL以及維護已頒發證書列表和這些證書狀態的數據庫。因為一般人無需管理crl,所以本文只介紹openssl ca關於證書管理方面的功能。 證書請求文件使用CA的私鑰簽署之後