跳到主內容

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

  • 安裝過程說明
    1. 安裝路徑
      • 預設值:/opt/shibboleth-idp
      • 建議直接按 Enter 使用預設值。
    2. 主機名稱 (Host Name)
      • 範例:idp.xxx.local
    3. 系統會自動產生憑證,範例如下:
      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
      
    4. SAML EntityID
      • 預設:https://idp.xxx.local/idp/shibboleth
      • 通常可直接按 Enter
    5. Attribute Scope
      • 預設為網域名稱,例如:xxx.local
    6. 完成初始化
      • 系統會生成 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
  • 取得 JettyShibboleth 基礎設定
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 ,若畫面如以下範例所示

補充說明


備註





參考相關網頁