Web Security Response Header

HTTP 安全Response Header,可以通過 Server 端(apache、nginx)的設定。告知瀏覽器安全方面的一些設定。用來增加網站的安全性。

先看一個Apache 的例子,以下內容 可以寫在 .htaccess 文檔中:

<IfModule mod_headers.c>
# 通知瀏覽器應該只通過 HTTPS 訪問該站點,瀏覽器應該記住的記住1年
Header always set Strict-Transport-Security "max-age=31536000" 

# 表示該頁面可以在相同域名頁面的 frame 中展示
Header set X-Frame-Options: "sameorigin"

# 阻止 請求類型是 style,且 MIME 類型不是 "text/css"。
# 阻止 請求類型是 script,且 MIME 類型不是 JavaScript MIME 類型
Header set X-Content-Type-Options: "nosniff"

# 阻止 JavaScript 通過 Document.cookie 屬性訪問 cookie
# 一個帶有安全屬性的 cookie 只有在請求使用 https: 的時候才會被發送到服務器。
Header always edit Set-Cookie (.*) "$1;HttpOnly;Secure"

# 啟用 XSS 過濾。如果檢測到攻擊,瀏覽器將不會清除頁面,而是阻止頁面加載。
Header set X-XSS-Protection "1; mode=block"
</IfModule>

Strict-Transport-Security。 (通常簡稱為 HSTS)響應標頭用來通知瀏覽器應該只通過 HTTPS 訪問該站點,並且以後使用 HTTP 訪問該站點的所有嘗試都應自動重定向到 HTTPS。

# 通知瀏覽器應該只通過 HTTPS 訪問該站點,瀏覽器應該記住的記住1年,規則也適用於該網站的所有子域名, 預加載
Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains; preload"

Strict-Transport-Security VS 301重定向。 可以接受訪問 http ,譬如 curl -X POST -d 'name=xx' http://www.python.com.tw/xxx/xx 不会被强制跳转而丢掉数据。

Permissions-Policy 啟用或禁止瀏覽器特性的機制。 譬如控制是否允許當前文檔使用 Geolocation 接口。

Header set Permissions-Policy: "geolocation=*"

Content-Security-Policy。允許站點管理者控制用戶代理能夠為指定的頁面加載哪些資源。這將幫助防止跨站腳本攻擊(Cross-Site Script)

Referrer-PolicyReferer 請求頭包含了當前請求頁面的來源頁面的地址。 Referrer-Policy 是針對 Referer 的策略

# 對應 同源的請求,發送來源、路徑以及查詢字符串。strict-origin-when-cross-origin(默認值) 
Header set Referrer-Policy "strict-origin-when-cross-origin"

詳情請參考 https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security

Self-signed certificates

Self-signed certificates, 自簽名憑證。在數據傳輸中是否有對數據加密?答案是肯定的,數據有加密。

Self-signed certificates 一般是用在內部網路加密數據傳輸。其特點如下:

  • 免費。自簽名證書是免費提供的,任何開發人員都可以申請。
  • 隨時簽發。自簽名證書可以隨時隨地簽發,不用等待第三方證書頒發機構的驗證和簽發。
  • 加密。自簽名SSL證書使用與其他付費SSL/TLS證書相同的方法加密傳輸數據。
  • 方便。自簽名證書不會在一段時間後過期或需要續訂,但CA頒發的證書卻會在一段時間後過期,還需要續訂。
  • 不被信任
  • 不會自動吊銷證書

生成 憑證參考:https://python.com.tw/openssl-generate-private-key-csr-crt/

OpenSSL 生成private key 、csr、crt

關於生成private key 、csr、crt等內容,網路上很多都是很多命令,讓人眼花。今天介紹一行命令搞定。哪怕多個域名的csr (req)一行也搞定。

  • 私有金鑰 – Pirvate Key
  • 簽署要求 – Certificate Signing Request(CSR)
  • 憑證 – CRT

先簡單說一個文檔格式。OpenSSL 命令行操作時 默認格式為PEM。

  • DER 是一種二進制格式
  • PEM 將二進制編碼成字符串。使用base64編碼。格式為:
-----BEGIN <whatever>----- 
data
-----END <whatever>----

一行命令生成 private key 和 csr

openssl req -nodes -newkey rsa:4096 \
    -keyout private.pem \
    -out csr.pem \
    -subj "/C=TW/ST=Zuid Holland/L=Rotterdam/O=ACME Corp/OU=IT Dept/CN=example.org"

參數說明

  • -nodes -newkey rsa:4096 生成 沒有加密的 private key, rsa:4096 是加密算法
  • -keyout private.pem key保存到 private.pem 這個文檔
  • -out csr.pem Csr 保存到 csr.pem 這個文檔
  • -subj csr 信息
  • /C Country Name 國家代碼,例如 EN TW 等
  • /ST State or Province Name ,省份
  • /L Locality Name
  • /O Organization Name 組織名稱
  • /OU Organizational Unit Name
  • /CN Common Name 通用名 例如 abc.com 或 *.abc.com

一行命令生成 private key 和 crt (自簽名 self signed cert)

openssl req -x509 -nodes -newkey rsa:4096 \
    -keyout private.pem \
    -out crt.pem \
    -days 356 \
    -subj "/C=TW/ST=Zuid Holland/L=Rotterdam/O=ACME Corp/OU=IT Dept/CN=example.org"

比上面的多了幾個參數

  • -x509 直接生成 crt
  • -days 356 有效日期

一行命令生成 private key 和 csr 多個Domain

OpenSSL 1.1.1 或以上版本

openssl req -nodes -newkey rsa:4096 \
    -keyout private.pem \
    -out csr.pem \
    -subj "/C=TW/ST=Zuid Holland/L=Rotterdam/O=ACME Corp/OU=IT Dept/CN=example.org"
    -addext "subjectAltName = DNS:localhost,DNS:example.org"

OpenSSL 1.1.1 以下版本:

openssl req -nodes -newkey rsa:4096 \
    -keyout private.pem \
    -out csr.pem \
    -subj "/C=TW/ST=Zuid Holland/L=Rotterdam/O=ACME Corp/OU=IT Dept/CN=example.org"
    -extensions san \
    -config <( \
    echo '[req]'; \
    echo 'distinguished_name=req'; \
    echo '[san]'; \
    echo 'subjectAltName=DNS:localhost,DNS:example.org')

使用比較流行的 ECC 编码

只要把 rsa:4096 替換為 ec:<(openssl ecparam -name secp384r1)

使用 openssl ecparam -list_curves 命令,可以查看 支持哪些ECC編碼。

tar.xz 文檔解壓、創建

今天看到了 php-8.2.9.tar.xz 文檔。 先了解一下 xz, 用 man xz 命令看一下。

xz is a general-purpose data compression tool with command line syntax 
similar to gzip(1) and bzip2(1)

一種壓縮格式,和 gzip bizp2 類似。

# 壓縮
xz filename
# 解壓縮
xz -d filename.xz or unxz filename.xz

在 man tar 命令的解釋中 有:

-J, --xz
    filter the archive through xz

所以解壓縮命令:

tar -xJf php-8.2.9.tar.xz