Shibboleth IDP SSO 開源的身分識別提供者軟體
BUBU 因有專案需要使用到 Shibboleth IDP 做 SSO 服務,因此有花了一段時間做測試本篇會記錄整個服務安裝流程
運行環境
環境都是在 「Proxmox VE 」 虛擬系統上架設,都是以 「 LXC 」模式為主,除非有特殊狀況會告知使用 「 VM 」 模式
- 系統環境: Ubuntu 24.04
- Web 服務: Jetty 12
安裝過程
流程一、安裝 Java 服務
- 因服務是用 Java 做編寫因此要安裝 Java JDK 服務,那會安裝 OpenJDK 服務
apt install openjdk-17-jdk -y
流程二、 Let's Encrypt 憑證轉換
由於 Jetty / Shibboleth
需要使用 PKCS12
格式憑證,而 Let's Encrypt
預設簽發的是 PEM
格式,因此必須先進行轉換才能使用。
Let's Encrypt
憑證轉換為PKCS12
格式
由於 Jetty / Shibboleth 預設需要使用 PKCS12 格式的憑證,而 Let's Encrypt 頒發的憑證是 PEM 格式,因此需要進行格式轉換。openssl pkcs12 -export \ -in /etc/letsencrypt/live/your-domain/fullchain.pem \ -inkey /etc/letsencrypt/live/your-domain/privkey.pem \ -out /opt/jetty/etc/keystore.p12 \ -name jetty \ -password pass:changeit
- 參數說明
- -in:來源憑證檔案(完整憑證鏈,通常是 fullchain.pem)
- -inkey:來源憑證的私鑰檔案(通常是 privkey.pem)
- -out:輸出的 PKCS12 憑證存放位置(例如 /opt/jetty/etc/keystore.p12)
- -name:憑證別名(Alias),這裡設定為 jetty,之後在 Jetty/IdP 設定中會用到
- -password pass:changeit:輸出 PKCS12 憑證的密碼。
⚠️ 預設範例使用 changeit,建議依實際需求更改為自訂密碼,並在 Jetty 設定檔(如 idp.ini)中保持一致。
- 參數說明
流程三、 Shibboleth IDP 設定
- 下載 Shibboleth IdP 安裝包
https://shibboleth.net/downloads/identity-provider/latest5/shibboleth-identity-provider-5.1.6.tar.gz
- 解壓縮安裝包
tar -zxvf shibboleth-identity-provider-*.tar.gz
- 進入安裝目錄
cd shibboleth-identity-provider-5.1.6/
- 執行安裝程式
./bin/install.sh
- 安裝過程說明
- 安裝路徑
- 預設值:
/opt/shibboleth-idp
- 建議直接按 Enter 使用預設值。
- 預設值:
- 主機名稱 (Host Name)
- 範例:idp.xxx.local
- 系統會自動產生憑證,範例如下:
INFO - Creating idp-signing, CN = idp.xxx.local URI = https://idp.xxx.local/idp/shibboleth, keySize=3072 INFO - Creating idp-encryption, CN = idp.xxx.local URI = https://idp.xxx.local/idp/shibboleth, keySize=3072 INFO - Creating backchannel keystore, CN = idp.xxx.local URI = https://idp.xxx.local/idp/shibboleth, keySize=3072 INFO - Creating Sealer KeyStore
- SAML EntityID
- 預設:
https://idp.xxx.local/idp/shibboleth
- 通常可直接按
Enter
- 預設:
- Attribute Scope
- 預設為網域名稱,例如:
xxx.local
- 預設為網域名稱,例如:
- 完成初始化
- 系統會生成
idp.war
並放置於/opt/shibboleth-idp/war/idp.war
- 系統會生成
- 安裝路徑
流程四、 Jetty 服務設定
- 下載
Jetty
服務包
wget https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-home/12.1.1/jetty-home-12.1.1.tar.gz
- 解壓安裝包
tar -zxvf jetty-home-*.tar.gz
- 移動剛剛
Jetty
執行位置
mv /root/jetty-home-12.1.1/ /var/jetty/
- 建立
Jetty
參數vim /etc/default/jetty
JETTY_HOME=/var/jetty
JETTY_BASE=/var/jetty-base
JETTY_USER=jetty
JETTY_START_LOG=/var/log/jetty/start.log
TMPDIR=$JETTY_BASE/tmp
JETTY_ARGS="jetty.ssl.port=8443"
- 載入上面已設定好的參數
source /etc/default/jetty
- 建立基礎目錄
mkdir $JETTY_BASE
- 取得
Jetty
的Shibboleth
基礎設定
git clone https://git.shibboleth.net/git/java-idp-jetty-base
cd java-idp-jetty-base
git checkout 12
cp -r src/main/resources/net/shibboleth/idp/module/jetty/jetty-base/* $JETTY_BASE
- 設定
Jetty
vim $JETTY_BASE/start.d/idp.ini
在最上面新增加以下參數
--exec
-Xmx1500m
-Djava.security.egd=file:/dev/urandom
-Djava.io.tmpdir=tmp
-Dlogback.configurationFile=resources/logback.xml
- 設定憑證所存放的路徑
vim $JETTY_BASE/start.d/idp.ini
# 這兩個參數是修正您目前憑證所存放的路徑
## Keystore file path (relative to $jetty.base)
jetty.sslContext.keyStorePath=../credentials/idp-userfacing.p12
## Truststore file path (relative to $jetty.base)
jetty.sslContext.trustStorePath=../credentials/idp-userfacing.p12
## Keystore type
jetty.sslContext.keyStoreType=PKCS12
## Truststore type and provider
jetty.sslContext.trustStoreType=PKCS12
# 以下是預設的密碼,如果您在做憑證轉換不是使用預設密碼記得這裡要做修正
## Keystore password
jetty.sslContext.keyStorePassword=changeit
## Truststore password
jetty.sslContext.trustStorePassword=changeit
## KeyManager password
jetty.sslContext.keyManagerPassword=changeit
- 確認
Shibboleth
所安裝路徑位置vim $JETTY_BASE/webapps/idp.xml
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN"
"https://www.eclipse.org/jetty/configure_10_0.dtd">
<!-- ======================================================== -->
<!-- Configure the Shibboleth IdP webapp -->
<!-- ======================================================== -->
<Configure class="org.eclipse.jetty.ee9.webapp.WebAppContext">
<Set name="war">/opt/shibboleth-idp/war/idp.war</Set>
<Set name="contextPath">/idp</Set>
<Set name="extractWAR">false</Set>
<Set name="copyWebDir">false</Set>
<Set name="copyWebInf">true</Set>
</Configure>
- 新增加日誌模組
logging-logback
java -jar /var/jetty/start.jar --add-module=logging-logback
- 檢查目前已載入的模組:
vim $JETTY_BASE/modules/idp.mod
,在檔案中可透過 depend 欄位查看 目前已載入的相關模組。
[description]
Shibboleth IdP
[depend]
ee9-annotations
ee9-deploy
ext
ee9-webapp
http
https
ee9-jsp
ee9-jstl
ee9-plus
resources
server
ee9-servlets
ssl
[files]
tmp/
- 將
Jetty
設定成服務vim /lib/systemd/system/jetty.service
[Unit]
Description=Jetty servlet for Shibboleth
After=network.target auditd.service
[Service]
EnvironmentFile=-/etc/default/jetty
ExecStart=java -jar /var/jetty/start.jar jetty.home=/var/jetty jetty.base=/var/jetty-base
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=simple
[Install]
WantedBy=multi-user.target
Alias=jetty.service
- 開機啟動服務
systemctl enable jetty.service
- 建立 Jetty 使用者
useradd -r -M jetty
- 設定
Jetty
使用者權限
chown -R jetty: /var/jetty-base/
- 啟動服務
systemctl start jetty.service
- 打開瀏覽器測試連線:
https://idp.xxx.local:8443/idp/status
,若畫面如以下範例所示,表示服務運作正常,此時仍需進一步設定「連線白名單」,以確保僅允許授權的用戶端存取。
- 設定連線白名單
vim /opt/shibboleth-idp/conf/access-control.xml
,在allowedRanges
這段裡面新增加白名單網段或位置
<entry key="AccessByIPAddress">
<bean id="AccessByIPAddress" parent="shibboleth.IPRangeAccessControl"
p:allowedRanges="#{ {'127.0.0.1/32', '192.168.1.0/24', '::1/128'} }" />
</entry>
- 設定完要重啟服務
systemctl restart jetty.service
- 打開瀏覽器測試連線:
https://idp.xxx.local:8443/idp/status
,若畫面如以下範例所示