顯示具有 SSL 標籤的文章。 顯示所有文章
顯示具有 SSL 標籤的文章。 顯示所有文章

2024年11月15日 星期五

linux 編譯 OpenSSL 安裝到 opt 文件中

linux 編譯 OpenSSL 安裝到 opt 文件中

安裝到 opt 中是為了避免對系統造成影響

# 下載並編譯 OpenSSL 庫
cd /tmp
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config --prefix=/opt/openssl-1.1.1 shared
make -j$(nproc)
sudo make install

# 臨時載入必要的環境變數
export LD_LIBRARY_PATH="/opt/openssl-1.1.1/lib"
export CPPFLAGS="-I/opt/openssl-1.1.1/include"
export LDFLAGS="-Wl,-rpath,/opt/openssl-1.1.1/lib -L/opt/openssl-1.1.1/lib"
export PATH="/opt/openssl-1.1.1/bin:$PATH"
openssl version


選這個版本是因為這是 python311 要求的最低版本,新版本的要編譯可能會卡到更多的依賴,需求夠用就好。


最新版本 3.4.0 版

# 需要的依賴
sudo yum install perl-IPC-Cmd -y

# 下載並編譯 OpenSSL 庫
cd /tmp
wget https://www.openssl.org/source/openssl-3.4.0.tar.gz
tar xzf openssl-3.4.0.tar.gz
cd openssl-3.4.0
./config --prefix=/opt/openssl-3.4.0 shared
make -j$(nproc)
sudo make install

# 臨時載入必要的環境變數
export LD_LIBRARY_PATH="/opt/openssl-3.4.0/lib64"
export CPPFLAGS="-I/opt/openssl-3.4.0/include"
export LDFLAGS="-Wl,-rpath,/opt/openssl-3.4.0/lib64 -L/opt/openssl-3.4.0/lib64"
export PATH="/opt/openssl-3.4.0/bin:$PATH"
openssl version



2024年9月17日 星期二

使用 PowerShell 一行指令自動生成自簽署證書

使用 PowerShell 一行指令自動生成自簽署證書


這是其他生成簽證的辦法

  1. 使用 openssl 自簽署SSL憑證證書
  2. 使用 powershell 自簽署SSL證書

第二個一樣用 powershell 但是是有簽署過程的,而本篇沒有簽署過程一行代碼直接完成全部,並自動儲存在 windwos 商店中,所以還需要多一個導出過程。





基於 SharePoint 的無應答登入模式改版後必須使用證書,這邊提供一個最簡證書生成方法,直接使用 PowerShell 5.1 內建的函式即可。

不過有以下兩個小缺點

  1. 無法匯出空白密碼的證書 pfx 檔案。(有這個需求用 OpenSSL 生成吧)
  2. 無法直接生成檔案,必須先存入 Windwos Certificate Store 匯出後再刪除


# 1. 定義変数
$CNName = "PnP_Roks"
$OutPath = "D:\mycertificates"
$ExpiryYears = 10
if(-not (Test-Path $OutPath)) { mkdir $OutPath }


# 2. 生成自簽署證書,存儲在當前用戶證書存儲區 (這一行就產好了)
$cert = New-SelfSignedCertificate -Subject "CN=$CNName" -DnsName $CNName `
  -CertStoreLocation Cert:\CurrentUser\My `
  -NotAfter (Get-Date).AddYears($ExpiryYears).date
$cert
# 3. 將證書安裝到受信任儲存區
$store = New-Object Security.Cryptography.X509Certificates.X509Store("Root", "LocalMachine")
$store.Open("ReadWrite"); $store.Add($cert); $store.Close()


# 4. 將證書公鑰導出為 CER 檔案 (需上傳到應用程式中)
$cert |Export-Certificate -FilePath "$OutPath\$CNName.cer"
# 5. 將證書導出為 PFX 檔案 (選用)
$Pword = "YourPasswordHere"
$cert |Export-PfxCertificate -FilePath "$OutPath\$CNName.pfx" `
  -Password (ConvertTo-SecureString -String $Pword -Force -AsPlainText)


# 6. 移除剛剛生成在個人儲存區的證書 (已經複製到信任區了這裡可以砍)
$cert | Remove-Item

這樣就生成完畢了,如果沒有移除證書的話可以在 certmgr.msc 中的 個人/憑證 區域找到該生成的證書。


需要上傳到 "應用程式" 中的只有 cer 證書而已,包含私鑰的 pfx 檔案不可以外洩。

比較理想的辦法是直接在目標伺服器生成證書,然後只匯出 cer 公鑰上傳到伺服器,一定程度避免私鑰產生副本。

環境允許的話甚至可以設置成不可匯出徹底銷毀,沒了再造一個就行。


上傳完畢接下來登入可以參考這篇 身份驗證 |PnP PowerShell




讀取證書檔案

其中如果要讀取 Store 中的 pfx 檔案可以這樣用

# 當前使用者
Get-Item -Path "Cert:\CurrentUser\My\$($cert.Thumbprint)"

# 本機
Get-Item -Path "Cert:\LocalMachine\My\$($cert.Thumbprint)"

對應的管理介面是

  • 當前用戶: certmgr.msc
  • 本機電腦: certlm.msc





匯出Linux格式

因為 PowerShell 不支援匯出 key 這個只能用第三方或是拿pwsh做了,這邊用 openssl 的範例從 pfx 轉換

導出 key 檔案

openssl pkcs12 -in "$CNName.pfx" -nocerts -nodes -out "$CNName.key"

導出 crt 檔案

openssl pkcs12 -in "$CNName.pfx" -clcerts -nokeys -out "$CNName.crt"

 

在 powershell 5.1 中似乎無法取出私鑰,即使用 Security.Cryptography.X509Certificates.X509Certificate2 取出來也是空值我就放棄了,改用 pwsh 或 openssl 吧

調查的結果好像是『 CNG (Cryptography Next Generation) vs CSP (CryptoAPI) 』的差異,PowerShell 5.1 只支援 CSP 缺了這個關鍵函式導致解不出來無法轉換




匯出Linux格式2

2025-07-16 這裡有個在微軟工作的大大寫的 pwsh 代碼可以直接產出
X509Certificate2 PowerShell module

產出來可以直接餵給 Nginx Proxy Manager 很方便

簡單的快速安裝腳本 (結尾的 chgs.com 是要註冊的網域)

& { param( [Parameter(Mandatory)][string]$cn, [switch]$force )

    # 檢查 PowerShell 版本
    if ($PSVersionTable.PSVersion.Major -lt 6) {
        Write-Error "❌ 此腳本需要 PowerShell 6.0 或更新版本。目前版本: $($PSVersionTable.PSVersion)" -EA Stop
    }

    # 檢查是否已有同 CN 的證書(比對 Subject)
    if (-not $force) {
        $store = New-Object Security.Cryptography.X509Certificates.X509Store("Root", "LocalMachine")
        $store.Open("ReadOnly")
        if ($store.Certificates | Where-Object { $_.Subject -eq "CN=$cn" }) {
            Write-Error "⚠ 已存在 CN=$cn 的證書,跳過安裝與匯出。" -EA Stop
        } $store.Close()
    }

    # 載入模組
    irm gist.githubusercontent.com/heaths/7b296f23e06156397bf2f07d69a64765/raw/841b2599ee45a096260454afdba89d21685c1ba0/X509Certificate2.psm1 | iex

    # 生成 SSL 證書
    $cert = New-X509Certificate2 -SubjectName "CN=$cn" -TLS -ValidDays 3650

    # 匯出 Linux 格式
    $cert | Export-X509Certificate2 "$cn.crt" -Type Certificate | Out-Null
    $cert | Export-X509Certificate2 "$cn.key" -Type PrivateKey | Out-Null

    # 安裝到信任區
    $store = New-Object Security.Cryptography.X509Certificates.X509Store("Root", "LocalMachine")
    $store.Open("ReadWrite"); $store.Add($cert); $store.Close()

    Write-Host "✅ 已成功產生並安裝 CN=$cn 的自簽憑證。"

} chgs.com





2023年10月15日 星期日

MSSQL 2022 快速建構 自簽署SSL證書

MSSQL 2022 快速建構 自簽署SSL證書

CHG: MSSQL 2022 如何創建 自簽署SSL憑證證書 導入並啟用加密連接

上一篇已經完整的解析如何建構自簽署SSL證書,這一篇是續集補上如何快速使用 PowerShell 建構的方式。不同於OpenSSL PowerShell 可以直接跳過中間步驟直接就簽署完了,步驟相對縮短很多。


另一篇 CHG: 使用 PowerShell 一行指令自動生成自簽署證書 可以快速簽證這個不會輸出CA證書直接就簽好SSL裝在簽證商店中。



伺服器端

創建證書

# 定義證書詳細資訊
$countryCode = "TW"
$state = "Taipei"
$city = "Taipei"
$companyName = "CHG"
$organizationalUnit = "CHG"
$dnsName = "192.168.3.68"

# 創建自簽名證書
$subject = "C=$countryCode, S=$state, L=$city, O=$companyName, OU=$organizationalUnit, CN=$dnsName"
$cert = New-SelfSignedCertificate -DnsName $dnsName -CertStoreLocation "cert:\LocalMachine\My" -Subject $subject -KeyExportPolicy Exportable -KeySpec Signature


給與SQLSERVER權限 (如果實例名不是預設的MSSQLSERVER記得修改)

# 將權限授權給 NT Service\MSSQLSERVER
$sqlLoginUser = "NT Service\MSSQLSERVER"
$keyPath = $cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
$fullKeyPath = Join-Path "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys" $keyPath
icacls $fullKeyPath /grant "$($sqlLoginUser):F"


信任該證書 (自己連接自己用的)

# 導出公鑰到 .cer 文件
$publicKeyPath = "$env:USERPROFILE\certificate.cer"
Export-Certificate -Cert $cert -FilePath $publicKeyPath
# 將公鑰安裝到本機信任位置
Import-Certificate -FilePath $publicKeyPath -CertStoreLocation cert:\LocalMachine\Root


到這證書設置就完成了,接下來需要回到 SQLSERVER 啟用該證書。詳細可以參考文章開頭連結那篇,裡面定位到【4. 在SQLSERVER中啟用SSL證書】補一下這章節內容


設置完畢再來,自己連接自己驗證一下證書可用性

# 使用 Windows認證 驗證加密情況
sqlcmd -S . -E -Q 'SET NOCOUNT ON SELECT c.session_id, c.encrypt_option, s.login_name, c.client_net_address, s.program_name FROM sys.dm_exec_connections c JOIN sys.dm_exec_sessions s ON c.session_id = s.session_id WHERE c.session_id = @@SPID' -W

命令解析:("-S ." = 連接自己), ("-E" = 使用當前登入的Windwos用戶)


執行結果有看到第二個欄位 True 就是加密連接的意思了





客戶端

剛剛伺服器端預設是產在使用者目錄底下,自行把 cer 文件複製過來
("$env:USERPROFILE\certificate.cer")

# 定義公鑰的路徑
$publicKeyPath = ".\certificate.cer"

# 導入公鑰到受信任的根證書發行機構
Import-Certificate -FilePath $publicKeyPath -CertStoreLocation cert:\LocalMachine\Root


再來驗證一下,這邊用 sqlserver認證 比較方便

# 使用 SqlServer認證 驗證加密情況
sqlcmd -S '192.168.3.54,1433' -U 'chg' -P 'chg' -Q 'SET NOCOUNT ON SELECT c.session_id, c.encrypt_option, s.login_name, c.client_net_address, s.program_name FROM sys.dm_exec_connections c JOIN sys.dm_exec_sessions s ON c.session_id = s.session_id WHERE c.session_id = @@SPID' -W


執行這個命令需要 "檢視伺服器狀態(SERVER STATE)" 的權限,參考以下幾個方法

  • 賦予 SERVER STATE 權限
  • 從伺服器角色中給予 processadmin 或 setupadmin 權限
  • 用 sa 帳戶登入


賦予該權限的圖形介面操作可以參考這張圖





MSSQL 2022 如何創建 自簽署SSL憑證證書 導入並啟用加密連接

MSSQL 2022 如何創建 自簽署SSL憑證證書 導入並啟用加密連接

繼前幾篇


已經是可以用的狀態了,補上最後一偏安全的問題 SSL證書,這個一般是需要花錢購買的,由第三方CA機構簽名才能把自己的域名發布到公共信任清單上。本篇測試用的用自簽署證書來測試整個流程。


以下總共分成下列幾大項目

  1. 創建SSL證書
  2. 在伺服器上安裝私鑰
  3. 設置伺服器端證書權限
  4. 在SQLSERVER中啟用SSL證書
  5. 在客戶端上安裝公鑰
  6. 測試加密狀態

本篇是完全手動最麻煩的教學攻略,要快速建造SSL直接用PowerShell是最快的
詳細請參考這一篇:CHG: MSSQL 2022 快速建構 自簽署SSL證書

快速建構篇是以本篇已經完成後的狀態去做的,不過基本也包含本篇8程的內容了,唯一缺少的是【4. 在SQLSERVER中啟用SSL證書】,如果要偷吃步直接跳記得這個步驟要補上




0. 安裝環境 MSYS2 與 OpenSSL

安裝這個是因為上面有現成的 OpenSSL 可以用,這個要在Windows上官方沒有給編譯好的檔案,除了自行編譯外只能載第三方編譯的。

載點:https://www.msys2.org/#installation



打開之後直接下一步就行了,沒什麼選項



打開之後長這樣輸入該指令安裝 OpenSSL

pacman -S openssl


這樣就安裝好可以用了



1. 創建SSL證書

分以下幾個步驟創建 (有更快的一行指令創建可以參這篇)

創建私鑰

openssl genpkey -algorithm RSA -out private_key.pem

這個執行完畢就創好了,私鑰要保存好不能公開



創建憑證請求

openssl req -new -key private_key.pem -out request.csr

這邊會需要輸入很多,唯一要注意的就是域名別亂填要填該伺服器主機的IP或域名
(這個會影響到之後接入的問題,如果IP是浮動會跑的趁現在趕緊固定一下)



簽署該請求 (本來應該是由第三方CA做的)

openssl x509 -req -days 365 -in request.csr -signkey private_key.pem -out certificate.cer

這樣就能拿到公鑰了 (這份私簽的證書不會上公服,要手動發給客戶端才能用)


這裡的私鑰其實應該是在產一個比較好,只是方便直接拿來用了
實際上提交給CA簽署的的時候,不用也不能連請求的私鑰也一起給出去

由CA簽署過的公鑰會被上傳到公共伺服器,實際上也不需要發送給客戶
只要證書還有效,客戶就能能從公共伺服器直接獲取並連上該域名



合成完整的證書

openssl pkcs12 -export -out certificate.pfx -inkey private_key.pem -in certificate.cer

這個可以把私鑰跟公鑰合併起來,合併後才是完整的證書

最小限度可以僅保存這個檔案就好,但公鑰cer建議保存,方便你發布到其他電腦
(不然丟了還要從 pfx 檔案打指令挖出來,或是安裝後按匯出公鑰)



確認檔案

最後 MSYS2 的預設使用者位置在這裡 (直接貼上就好)

C:\msys64\home\%UserName%

確認一下檔案都在這兩個框起來是需要的檔案





2. 在伺服器上安裝私鑰

安裝證書

對著pfx檔案點擊右鍵"安裝pfx"



進入安裝介面選擇"本機電腦"



選擇下一步,密碼跟設置成可匯出根據自己需求選擇



安裝到"個人"(否則在SqlServer中會看不到證書)





3. 設置伺服器端證書權限

再來需要設置權限給 SQLSserver 有權使用他

按下 CTRL+R 打開執行視窗輸入 "certlm.msc" 按下確定打開憑證管理員



然後在個人中找到剛剛安裝的證書右鍵管理私密金鑰



選擇新增



然後輸入 NT Service\MSSQLSERVER 後按下檢查名稱,之後按下確定

這裡 MSSQLSERVER 其實就是預設的實例名,如果忘了實例名
可以像圖中背景那樣從SQL設定管理員那裏抄過來就好


看一下有沒有多出 MSSQLSERVER 然後再按下確定


這樣就完成了SQL已經有權限可以使用他



4. 在SQLSERVER中啟用SSL證書

再來到 SQL 設定管理員中啟用該證書
對著通訊協定按右鍵內容 -> 選擇憑證分頁 -> 選擇你的憑證



前面一頁旗標的分頁打開強制加密



最後再把 SQLServer 重新啟動即可



至此就完成這樣伺服器端的設置了




5. 在客戶端上安裝公鑰

在客戶端上對著cer檔案按右鍵安裝憑證



選擇本機電腦



安裝到"受信任的根憑證授權單位"



這樣就完成了。 (注意這個不能裝到別的地方會無效)




6. 測試加密狀態

要測試的話可以參考這一篇
CHG: SQL Server 如何加密連接 Server/Client 端解說

這邊簡單把內容搬過來快速講一下,就是打入測試指令而已。
記得尾端要移除 -N -C 這樣才能測試伺服器端到底有沒有強制打開。

sqlcmd -S '192.168.3.54,1433' -U 'chg' -P 'chg' -Q 'SET NOCOUNT ON SELECT c.session_id, c.encrypt_option, s.login_name, c.client_net_address, s.program_name FROM sys.dm_exec_connections c JOIN sys.dm_exec_sessions s ON c.session_id = s.session_id WHERE c.session_id = @@SPID' -W


這邊有一點要注意的是連入的伺服器名稱必須跟證書上的一樣,我上面創建證書是用IP就只能用IP登入,原本其實打電腦名稱也可以登入導入後就不行了。



這邊可以看到有個 True 這個就是成功加密了

可能有人有注意到圖中是伺服器端自己連自己,這樣測試還有效嗎?答案是有效的。因為就如同剛剛所提 cer 沒有導入到"受信任的根憑證授權單位"就無法使用,自然就無法依靠安裝在"個人"中的 pfx 證書連上了。

可能會想說那我直接把 pfx 安裝在"受信任的根憑證授權單位"不就可以一舉兩得?想法很完美但 SqlServer 預設只會讀"個人"中的證書,會直接導致看不到證書無法設置定的。





2023年10月13日 星期五

如何產生自簽署 OpenSSL 證書

如何產生自簽署 OpenSSL 證書



1. 產生私鑰 pem

通過這個指令可以直接產出來

openssl genpkey -algorithm RSA -out private_key.pem



2. 憑證請求 csr (Certificate Signing Request)

openssl req -new -key private_key.pem -out request.csr

這邊其實很多資訊可以跳過,只是要注意的是網域不能亂填



3. 簽署該請求 cer/crt

openssl x509 -req -days 365 -in request.csr -signkey private_key.pem -out certificate.cer

這邊簽署本來應該是由CA做的,簽署用的私鑰可以是其他私鑰,只是方便用同一個



4. 打包成 pfx 檔案

openssl pkcs12 -export -out certificate.pfx -inkey private_key.pem -in certificate.cer

最後一個步驟是把簽署完畢的 cer 檔案跟原本的私鑰合併成完整的證書


到這邊就完成了,最後注意一下自簽證書存放在 Store 的位置,要放到
【客戶端:: /本機/受信任的憑證授權單位】這個位置才能起作用

私鑰也就是那個 pfx 沒影響放哪都行,不過建議放到
【伺服端:: /本機/個人】比較好找






檔案關係圖

最後整理一下各個檔案的關係,提示一下上面的教學因為是自簽的所以用同一份私鑰,實際上整個過程是會出現兩份私鑰的。

證書的生成關係圖 (私鑰不會保留在這裡僅參與簽名)

certificate.cer # 最終生成的證書,包含公司公鑰及 CA 的數字簽名
 ├─ private_key_ca.pem # CA 私鑰:用於簽署 CSR 請求(不會儲存在證書中)
 └─ request.csr        # 證書簽署請求:包含公司公鑰及簽署的公司識別信息
     ├─ private_key_company.pem # 公司私鑰:用於簽署公司識別信息(不會儲存在請求中)
     └─ information.txt         # 公司識別信息:包含組織名稱、域名等


最後再將CA簽署後的文件,也就是證書公鑰跟自己私鑰合併打包就成了 pfx 檔案了

最終只要保留兩份檔案就好

  • certificate.cer # 證書公鑰
  • certificate.pfx # 證書私鑰


簽名本質上就是使用私鑰對一串文本進行加密,最後再將兩者組合起來,例如 "{明文文本}{加密後哈希}" 

這個簽名可以使用對方提供的公鑰驗證,對哈希值解密可以得到相同的明文。藉此證明這段信息確實是由對方發出的

證明是利用的是非對稱加密的特性,該哈希值只能由另一把鑰匙生成,沒有別的方法了


上面只能證明這個信息是由google傳的,如果要證明你連接的對方是真正的google而不是假冒的第三方,就用公鑰加密一段信息然後丟過去讓對方解密,解出之後對答案就能知道了



參考文獻

  1. CHG: MSSQL 2022 如何創建 自簽署SSL憑證證書 導入並啟用加密連接
  2. CHG: MSSQL 2022 快速建構 自簽署SSL證書