1. 程式人生 > >如何在Ubuntu 16.04中為Apache建立一套自簽名SSL證書

如何在Ubuntu 16.04中為Apache建立一套自簽名SSL證書

內容介紹

TLS,全稱為傳輸層安全,及其前身SSL,全稱為安全巢狀層,都屬於將普通流量打包為受保護加密封裝的Web協議。

使用這項技術,伺服器能夠在伺服器與客戶間安裝傳輸資料,而無需擔心訊息為外部所截獲。其證書系統還能夠幫助使用者核實其所連線站點的身份。

在本教程中,我們將探討如何在Ubuntu 16.04伺服器上為Apache Web伺服器設定一份自簽名SSL證書。

注意:自簽名證書將對伺服器與客戶端間的通訊內容進行加密。然而,由於其簽名並非來自受信證書中心,因此使用者無法使用該證書自動驗證伺服器身份。

自簽名證書適用於那些伺服器不具備相關域名的情況,特別是那些不面向使用者的加密Web介面例項。如果大家擁有域名,那麼一般來說最好是使用CA簽名證書。大家可以參閱

此文瞭解如何利用Let’s Encrypt設定免費受信證書。

先決條件

在開始之前,大家首先應該擁有一個具備sudo許可權的非root使用者。參閱Ubuntu 16.04初始伺服器設定一文了解如何設定這樣的使用者賬戶。

另外,大家還需要安裝一套Apache Web伺服器。如果各位希望在伺服器上安裝LAMP(即Linux、Apache、MySQL與PHP)堆疊,請參閱在Ubuntu 16.04上設定LAMP。如果大家只希望使用Apache Web伺服器,則請路過教程中的PHP與MySQL部分。

第一步:建立SSL證書

TLS/SSL採用公共證書與私鑰的結合體。SSL金鑰在伺服器上進行安全儲存,用於對傳送至客戶端的內容進行加密。SSL證書則由任何請求該內容的使用者共享,可用於解密對應SSL金鑰所簽署的內容。

大家可以使用以下命令利用OpenSSL建立一條自簽名金鑰與證書:

  • sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

下面來看命令中的各部分內容:

  • openssl: 基本命令列工具,用於建立並管理OpenSSL證書、金鑰與其它檔案。
  • req: 此子命令指定我們希望使用X.509證書籤名請求(簡稱CSR)管理。其中X.509是一項公鑰基礎設施標準,SSL與TLS將其指定為金鑰與證書管理機制。
  • -x509: 進一步修改前一條子命令,告知工具我們需要的是自簽名證書,而非生成普通的證書籤名請求。
  • -nodes: 告知OpenSSL跳過利用密碼保護證書的選項。我們的Apache需要在伺服器啟動時能夠在不經使用者許可的情況下讀取該檔案,而密碼會影響到這一流程。
  • -days 365: 此選項選定證書的有效時限。我們將其設定為一年。
  • -newkey rsa:2048: 指定我們希望同時生成一份新證書與新金鑰。我們在上一步設定中無需建立金鑰即可簽署證書,因此這裡需要將金鑰與證書一同建立。其中rsa:2048部分指定生成RSA金鑰,長度為2048位。
  • -keyout: 此行告知OpenSSL將生成的金鑰檔案儲存在何處。
  • -out: 告知OpenSSL將我們建立的證書儲存在何處。

以上各選項將同時建立金鑰檔案與證書。我們還需要回答幾個與伺服器相關的問題以在證書中新增正確的資訊。

正確填寫提示內容。最重要的一行就是Common Name(例如伺服器FQDN或者域名)。大家需要填寫伺服器相關域名或者公共IP地址。

完整的提示內容如下:

Output

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:[email protected]_domain.com

建立完成的兩個檔案都將儲存在/etc/ssl目錄中的對應子目錄內。

在使用OpenSSL時,大家應當建立一個強Diffie-Hellman組,用於同客戶端談判時的完全正向保密

具體實現方式如下:

  • sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

整個過程可能耗時幾分鐘,但完成後即可在/etc/ssl/certs/dhparam.pem處生成可用於配置的強DH組。

第二步:配置Apache以使用SSL

我們在/etc/ssl目錄下建立了金鑰與證書檔案,現在修改Apache配置以使用這些檔案。

我們需要在配置中進行以下調整:

  1. 建立一個配置片段以指定強預設SSL設定。
  2. 修改其中的SSL Apache Virtual Host檔案以指向我們生成的SSL證書。
  3. (建議) 修改未加密Virtual Host檔案以將請求自動指向至加密Virtual Host。

完成後,安全SSL配置即大功告成。

利用強加密設定建立Apache配置片段

首先建立一條Apache配置片段以定義部分SSL設定。首先在/etc/apache2/conf-available目錄內建立一個新片段。我們將使用ssl-params.conf作為檔名:

  • sudo nano /etc/apache2/conf-available/ssl-params.conf

要安全設定Apache SSL,請參閱Remy van ElstCipherli.st站點上給出的相關建議。此站點專門為各主流軟體提供易於使用的加密設定。大家可以參閱此文瞭解更多與Apache選項相關的內容。

在本示例中,我們可以直接複製以上站點提供的設定。不過,我們還需要將其中的SSLOpenSSLConfCmd DHParameters設定為指定我們剛剛生成的Diffie-Hellman檔案:

/etc/apache2/conf-available/ssl-params.conf

# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off 
SSLSessionTickets Off
SSLUseStapling on 
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"

SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem"

完成後儲存並退出。

修改預設Apache SSL Virtual Host檔案

接下來,修改/etc/apache2/sites-available/default-ssl.conf檔案,即預設Apache SSL Virtual Host檔案。如果大家使用其它伺服器塊檔案,則注意替換以下命令中的對應部分:

在進行之前,首先備份初始SSL Virtual Host檔案:

  • sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

現在開啟SSL Virtual Host檔案並進行調整:

  • sudo nano /etc/apache2/sites-available/default-ssl.conf

取消其中的大部分註釋,調整前的內容如下:

/etc/apache2/sites-available/default-ssl.conf

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
            ServerAdmin [email protected]

            DocumentRoot /var/www/html

            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined

            SSLEngine on

            SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
            SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

            <FilesMatch "\.(cgi|shtml|phtml|php)$">
                            SSLOptions +StdEnvVars
            </FilesMatch>
            <Directory /usr/lib/cgi-bin>
                            SSLOptions +StdEnvVars
            </Directory>

            # BrowserMatch "MSIE [2-6]" \
            #               nokeepalive ssl-unclean-shutdown \
            #               downgrade-1.0 force-response-1.0

    </VirtualHost>
</IfModule>

我們需要對VIrtual Host檔案中的常規變更內容進行調整(ServerAdmin郵箱地址、ServerName等)、將SSL命令指向我們的證書與金鑰檔案,同時取消早期瀏覽器相容性部分的註釋。

變更完成後,檔案內容如下:

/etc/apache2/sites-available/default-ssl.conf

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
            ServerAdmin [email protected] server_domain_or_IP

            DocumentRoot /var/www/html

            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined

            SSLEngine on

            SSLCertificateFile      /etc/ssl/certs/apache-selfsigned.crt
            SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

            <FilesMatch "\.(cgi|shtml|phtml|php)$">
                            SSLOptions +StdEnvVars
            </FilesMatch>
            <Directory /usr/lib/cgi-bin>
                            SSLOptions +StdEnvVars
            </Directory>

            BrowserMatch "MSIE [2-6]" \nokeepalive ssl-unclean-shutdown \downgrade-1.0 force-response-1.0

    </VirtualHost>
</IfModule>

完成後儲存並退出。

(建議) 修改未加密VIrtual Host檔案以重新定向至HTTPS

到這裡,伺服器將同時提供未加密HTTP與加密HTTPS流量。為了提升安全性,最好將HTTP流量自動定向至HTTPS。如果大家不需要這項功能,請直接跳過此節。

為了將未加密Virtual Host檔案重新定向至SSL加密流量,我們開啟/etc/apache2/sites-available/000-default.conf檔案:

  • sudo nano /etc/apache2/sites-available/000-default.conf

在其中的VirtualHost配置部分,我們新增Redirect指令將全部流量指向該站點的SSL版本:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    . . .

    Redirect "/" "https://your_domain_or_IP"

    . . .
</VirtualHost>

完成後儲存並退出。

第三步:調整防火牆

如果大家啟用了ufw防火牆,則需要調整設定以允許SSL流量通過。幸運的是,Apache登錄檔已經預告安裝了部分ufw配置。

通過以下命令檢視可用配置:

  • sudo ufw app list

返回列表如下:

Output

Available applications:
  Apache
  Apache Full
  Apache Secure
  OpenSSH

檢視當前設定:

  • sudo ufw status

如果之前只允許常規HTTP流量輸入,則輸出結果如下:

Output

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache                     ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache (v6)                ALLOW       Anywhere (v6)

要允許HTTPS流量接入,我們可以允許“Apache Full”配置而後刪除多餘的“Apache”配置:

  • sudo ufw allow ‘Apache Full’

  • sudo ufw delete allow ‘Apache’

調整後的狀態如下:

  • sudo ufw status

    Output
    
    Status: active
    
    To                         Action      From
    --                         ------      ----
    OpenSSH                    ALLOW       Anywhere
    Apache Full                ALLOW       Anywhere
    OpenSSH (v6)               ALLOW       Anywhere (v6)
    Apache Full (v6)           ALLOW       Anywhere (v6)
    

第四步:在Apache中應用變更

現在各項變更已經完成,接下來重啟Apache即可將其付諸使用。

我們可以通過a2enmod命令啟用Apache SSL模組mod_ssl,外加SSL片段設定所必需的mod_headers:

  • sudo a2enmod ssl

  • sudo a2enmod headers

接下來,利用a2ensite命令啟用SSL Virtual Host:

  • sudo a2ensite default-ssl

現在,我們的站點及必要模組都已經啟用。接下來進行檢查以確保檔案中不存在語法錯誤:

  • sudo apache2ctl configtest

如果一切順利,則返回結果如下:

Output

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

第一行資訊提示我們ServerName指令未被設定為全域性。如果大家希望忽略該資訊,則可在/etc/apache2/apache2.conf中將ServerName設定為伺服器域名或者IP地址。當然,放著不管也沒問題。

在輸出結果為Syntax OK後,我們就能夠重啟Apache以應用變更了:

  • sudo systemctl restart apache2

第五步:測試加密

下面開啟瀏覽器並輸入伺服器域名或者IP:

https://server_domain_or_IP

由於我們建立的證書並非由瀏覽器信任的證書中心頒發,因此其中可能顯示警告:

大家不用緊張。我們關心的是證書是否進行了正確加密。點選“ADVANCED”而後點選連結繼續訪問主機:

站點應該可以成功訪問了。可以看到,瀏覽器位址列中有一個“X”標記,這意味著該證書無法驗證。不過可以確定的是,我們的連線仍然得到了加密。

如果在配置中將HTTP定向至HTTPS,則可檢查其重新定向功能是否正確:

http://server_domain_or_IP

如果瀏覽結果相同,則功能正確無誤。

第六步:更改為永久重新定向

若重新定向機制正常起效,那麼大家可以對未加密Apache Virtual Host進行永久重新定向。

再次開啟伺服器配置檔案:

  • sudo nano /etc/apache2/sites-available/000-default.conf

找到其中的Redirect行,新增permanent,其會將302臨時重新定向變更為301永久重新定向:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    . . .

    Redirect permanent "/" "https://your_domain_or_IP"

    . . .
</VirtualHost>

儲存並退出。

檢查配置檔案中是否存在語法錯誤:

  • sudo apache2ctl configtest

完成後,重啟Apache以應用變更:

  • sudo systemctl restart apache2

總結

大家已經對Apache伺服器進行了配置,要求其使用強加密處理客戶端連線。如此一來,我們能夠更為安全地處理請求,從而避免外部人士讀取我們的流量。

翻譯:diradw

相關推薦

如何在Ubuntu 16.04Apache建立簽名SSL證書

內容介紹 TLS,全稱為傳輸層安全,及其前身SSL,全稱為安全巢狀層,都屬於將普通流量打包為受保護加密封裝的Web協議。 使用這項技術,伺服器能夠在伺服器與客戶間安裝傳輸資料,而無需擔心訊息為外部所截獲。其證書系統還能夠幫助使用者核實其所連線站點的身份。

ubuntu 16.04 把intel i915顯示卡驅動 更改開源驅動/開源驅動改回intel驅動

檢視顯示卡驅動及其是否裝好 sudo lshw -c video 檢視顯示卡 lspci | grep VGA 安裝開源驅動 sudo apt-get install xserver-xorg-video-ati 把核心版本從4.4升級到4.5,4.5中似乎修復了

Ubuntu 16.04如何修改mysql的編碼utf-8

積累,小白也有大神夢 在雲伺服器上搭建mysql資料庫的時候,發現預設的編碼並不是utf-8,所以在對資料庫進行釋出的時候,遇到了亂碼的問題。只有將mysql的編碼修改之後,然後把表刪除,在重新建表才擺脫了這個問題。這裡對修改mysql的編碼做一簡單總

Ubuntu 16.04下安裝Apache壓力測試工具ab

apt-get gpo 簡單使用 utils sta markdown 測試結果 壓力測試 安裝apache 安裝 sudo apt-get install apache2-utils 簡單使用 # 對http://www.baidu.com/進行100次請求,10個並發請

Ubuntu 16.04Android編譯OpenCV 3.2.0 Manager

由於 ica 如何 setting -i add 標記 roi stripe http://johnhany.net/2016/07/build-opencv-manager-for-android-on-ubuntu/ 最近想在Android上嘗試一下SIFT和SU

Ubuntu 16.04安裝tftp

-c 安裝 tp服務器 htm strong option apt-get ref itl 引用自:https://www.linuxidc.com/Linux/2016-07/133255.htm Ubuntu 16.04中安裝tftp 1. 安裝 $ apt-g

Ubuntu 16.04安裝谷歌Chrome瀏覽器

谷歌軟件 終端 當前 .html 下載源 .com sta 步驟 baidu 1.進入 Ubuntu 16.04 桌面,按下 Ctrl + Alt + t 鍵盤組合鍵,啟動終端。 2.在終端中,輸入以下命令: sudo wget https://repo.

Python 2.7.12+Django 1.11.8+Ubuntu 16.04.4 LTS+Apache 2.4.33寶塔配置

鏈接 是我 AD 測試環境 可能 static ive window In 將在本地localhost的項目部署到寶塔上;首先創建兩個域名,因為是測試環境,所以只是修該了C:\Windows\System32\drivers\etc\host文件 然後分別建立了前端(

MapReduce配置遇到的問題和ubuntu 16.04下使用eclipse建立工程時卡死的解決方法

1、左邊欄的Project Explorer裡一直不出現DFS Locations.   發現在把hadoop-eclipse-plugin-2.6.0.jar放到eclipse下的pluins資料夾下並且eclipse -clean之後依舊不顯示,後來找到問題所在。   在Linux虛擬機器裡換了新的E

Ubuntu 16.04ant的安裝和配置

不推薦sudo apt-get install ant安裝。採用手動安裝。 1. 到Apache官網下載最新版本的ant:http://ant.apache.org/bindownload.cgi 2.解壓 sudo mkdir -p /opt/ant sudo ta

Ubuntu 16.04上使用Apache安裝phpBB

PhpBB是一個開源的公告板程式。本文將向您展示如何在Ubuntu 16.04上在Apache webserver上安裝phpBB。它是使用phpBB 3.2.1編寫的,但是這裡提供的說明可能也適用於新版本的phpBB。 先決條件 本文假設您已經使用Ubuntu 16

Ubuntu 16.04樹莓派(RaspBerry Pi 3)編譯Android 7(Nougat)

1. 環境準備和介紹         本文章的測試環境如下: 軟體環境:VMware Workstation Pro + Ubuntu 16.04  64 bit,虛擬機器的記憶體配置6GB,4個CPU 硬體環境:RaspBerry Pi3 + 16GB SD卡 測試

ubuntu 16.04如何掛載windows的磁碟

我們在裝windows+linux雙系統的時候,往往會犯一個錯誤,總覺得linux不會成為主力系統,所以給他分配的磁碟空間一般都在20~30G左右,但是之後往往發現磁碟空間不足,這時候如果再重灌系統的話又很麻煩,擴充套件空間同樣比較麻煩,那我們可以使用windows下的磁碟

Linux系統使用--Ubuntu 16.04 安裝知筆記

一、前言 為了測試MetaWebBlog協議在為知筆記的使用情況,需要安裝為知筆記。 二、準備工具和環境搭建 2.1 準備工具 安裝Linux版的為知筆記需要準備很多必要的工具,現列表如

Ubuntu 16.04 修改幾個國內更新源

1 在修改source.list前,最好先備份一份備份sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak2 修改source.list檔案:s

解決Ubuntu 16.04知筆記不能輸入中文的問題

cp /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so /opt/Qt5.7.0/5.7/gcc_64/plugins/platforminputcontexts/

Ubuntu 16.04進行Sysbench環境搭建

本文只介紹sysbench的使用教程,詳細介紹見參考資料。 1、安裝MySQL sudo apt-get install mysql-server 安裝過程中需要設定密碼,我們設定為123。 2、更改MySQL配置檔案 vim /etc/mysql/mysql.

ubuntu 16.04安裝jdk-8u181並配置環境變數

1.到官網下載對應的jdk的包。我下的是jdk-8u181-linux-x64.tar.gz 2.解壓 執行tar zvxf jdk-8u181-linux-x64.tar.gz解壓獲得資料夾jdk1.8.0_181 3.建立安裝目錄 sudo mkdir /op

如何在Ubuntu 16.04安全升級Nvidia驅動

Nvidia在2017年5月4日釋出了375.66驅動,其中添加了對gtx 1080 ti顯示卡的支援。本文將介紹如何在Ubuntu 16.04中快速安全升級已有的顯示卡驅動。作者的機器上配置有CUDA,Cudnn和Caffe, Pytorch, Tensorflow等試驗

Ubuntu 16.04Stardict詞典安裝和使用(可以螢幕取詞)

1、安裝stardict命令列:sudo apt-get install stardict2、下載詞典下面這位仁兄的詞典很全,大家可以按需下載。3、匯入詞典假如下載在Downloads資料夾中。在~/目錄下輸入命令列:sudo tar jxf  Downloads/stard