サーバ証明書の取得とApacheの設定
1.「UPKI電子証明書発行サービス」の利用管理者編をご覧いただき、サーバ証明書発行を申請します。機関の審査手続きによっては証明書の交付までには数日を要する場合がありますので、お早めに申請してください。
接続実験をするだけであれば、IdPインストール時に作成された証明書(自己署名証明書)をそのまま利用してテストフェデレーションに参加することも可能です。その場合は、以降の記述のうち「中間CA証明書」の部分は無視してください。
2.入手したサーバ証明書をもとに、以下のファイルに設定してください。
■/etc/httpd/conf.d/ssl.conf
まず、秘密鍵を"root"ユーザのみが参照できるようにアクセス制限がかかっているか確認してください。確認できない場合は以下のようにして所有者・グループ・パーミッションを設定してください。
chown root:root /etc/pki/tls/private/
server.key
← 秘密鍵の格納先chmod 400 /etc/pki/tls/private/
server.key
/etc/httpd/conf.d/ssl.conf を以下のように編集してください。
(省略)SSLCertificateFile /etc/pki/tls/certs/server.crt
← サーバ証明書の格納先
(省略)SSLCertificateKeyFile /etc/pki/tls/private/server.key
← 秘密鍵の格納先
(省略)SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
← 中間CA証明書の格納先
↑ 先頭の「#」を削除して、コメントを解除してください。
※端末のサイズによっては表記がずれる可能性がございます。画面を広くしてご覧ください。
詳しくは、サーバ証明書インストールマニュアルの Apache 2 + mod_ssl 編を参照してください。
メタデータの作成と提出
Back-Channelの設定
SAML 1のSPにも接続する場合は、IdPとの通信時にTLS接続を行うため、下記にしたがいBack-Channelの設定を行ってください。 このTLS接続ではポート8443を利用します。
1.キーストアの設定
サーバ証明書を格納したキーストアを作成します。
# cd /opt/shibboleth-idp/credentials
# UMASKORIG="`umask`" ; umask 0077
# openssl pkcs12 -export -out server.p12 -in サーバ証明書.crt -inkey サーバ秘密鍵.key -name サーバ名
Enter Export Password: エクスポートパスワードを入力
Verifying - Enter Export Password: エクスポートパスワードを再入力
(ここで聞かれるエクスポートパスワードを後述のidp-backchannel.iniの「P12パスワード」に指定します。任意のものを設定できます)
# umask "$UMASKORIG"
(上記一連のumaskコマンドは"chmod 600 server.p12"と同義)
※PKCS#12(別名PKCS12またはPFX)は、証明書チェーンと秘密鍵を単一の暗号化可能なファイルに格納するためのバイナリ形式です。 PKCS#12ファイルは、WindowsおよびmacOSコンピューターで証明書と秘密鍵をインポートおよびエクスポートするために一般的に使用され、通常はファイル名拡張子が付きます .p12
or .pfx
.
※また、ここで使っているopensslコマンドの引数及びオプションの意味は次の通りです。
pkcs12: PKCS#12 Data Management.
-export
-out 出力ファイル名
-in サーバ証明書ファイル名(ex. /etc/pki/tls/certs/server.crt)
-inkey サーバ秘密鍵ファイル名(ex. /etc/pki/tls/private/server.key)
-name サーバ名(ex. ex-idp-test22.gakunin.nii.ac.jp)
Jettyを"jetty"ユーザで実行する場合は、さらに以下のコマンドを実行しJettyが読み取れるようにします。
# chgrp jetty /opt/shibboleth-idp/credentials/server.p12
# chmod g+r /opt/shibboleth-idp/credentials/server.p12
2.ライブラリのコピー
https://build.shibboleth.net/nexus/content/repositories/releases/net/shibboleth/utilities/jetty9/jetty94-dta-ssl/1.0.0/jetty94-dta-ssl-1.0.0.jar よりダウンロードします。
jetty94-dta-ssl-1.0.0.jar を /opt/jetty-base/lib/ext 配下にコピーします。
※Jetty11でも同じ拡張APIをサポートしてるため、jetty94-dta-ssl-1.0.0.jar (asc) プラグインの名前は変更されていません。
# wget https://build.shibboleth.net/nexus/content/repositories/releases/net/shibboleth/utilities/jetty9/jetty94-dta-ssl/1.0.0/jetty94-dta-ssl-1.0.0.jar
# mkdir /opt/jetty-base/lib/ext ←extディレクトリがない時は作成する。
# cp jetty94-dta-ssl-1.0.0.jar /opt/jetty-base/lib/ext
ダウンロードされるJARファイルのSHA-256ハッシュ値は以下の通りです。さらに真正性を確認したい場合はPGP署名をご利用ください。# sha256sum jetty94-dta-ssl-1.0.0.jar
5e5de66e3517d30ff19ef66cf7a4aa5443b861d83e36a75e85845b007a03afbf jetty94-dta-ssl-1.0.0.jar
なお、配置したファイルはデフォルトでは使用されません。すでに /opt/jetty-base/lib/ext 配下に存在する jetty9-dta-ssl-1.0.0.jar が使用されます。併存していても問題ありません。もしデフォルトの設定で問題がある場合は(一部の証明書で問題になるという情報があります)、etc/idp-backchannel.xml
の以下の部分を修正し新しいライブラリを使用するようにしてください。
@@ -6,7 +6,7 @@ <!-- and no container trust (delegate to application) --> <!-- for backchannel (SOAP) communication to IdP --> <!-- ============================================================= --> - <New id="shibContextFactory" class="net.shibboleth.utilities.jetty9.DelegateToApplicationSslContextFactory"> + <New id="shibContextFactory" class="net.shibboleth.utilities.jetty94.DelegateToApplicationSslContextFactory"> <Set name="KeyStorePath"><Property name="idp.backchannel.keyStorePath" default="../credentials/idp-backchannel.p12" /></Set> <Set name="KeyStoreType"><Property name="idp.backchannel.keyStoreType" default="PKCS12" /></Set> <Set name="KeyStorePassword"><Property name="idp.backchannel.keyStorePassword" default="changeit" /></Set>
3.SOAP設定
/opt/jetty-base/start.d/idp-backchannel.ini ファイルを以下のように作成します。
# cd /opt/jetty-base/start.d
# cp idp-backchannel.ini.dist idp-backchannel.ini
# chgrp jetty idp-backchannel.ini
# chmod 640 idp-backchannel.ini
/opt/jetty-base/start.d/idp-backchannel.ini ファイルを以下のように修正します。
# ---------------------------------------
# Module: idp-backchannel
# Shibboleth IdP Dedicated SOAP Connector
# ---------------------------------------
↑コメントアウト(#)を削除。以下同様# --module=idp-backchannel## Backchannel connector port to listen on
# idp.backchannel.port=8443
## Backchannel keystore file path (relative to $jetty.base)
# idp.backchannel.keyStorePath=../shibboleth-idp/credentials/server.p12
## Backchannel keystore password
# idp.backchannel.keyStorePassword=P12パスワード
## Backchannel keystore type
# idp.backchannel.keyStoreType=PKCS12
/opt/jetty-base/etc/idp-backchannel.xml ファイルを以下のように修正します。
(省略)
<New id="shibHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
↑上の行を削除し↓で置き換え<Arg><Ref refid="httpConfig"/></Arg> <Set name="secureScheme"><Property name="jetty.httpConfig.secureScheme" default="https" /></Set>
<Set name="securePort"><Property name="jetty.httpConfig.securePort" deprecated="jetty.secure.port" default="8443" /></Set>
<Set name="outputBufferSize"><Property name="jetty.httpConfig.outputBufferSize" deprecated="jetty.output.buffer.size" default="32768" /></Set>
<Set name="outputAggregationSize"><Property name="jetty.httpConfig.outputAggregationSize" deprecated="jetty.output.aggregation.size" default="8192" /></Set>
<Set name="requestHeaderSize"><Property name="jetty.httpConfig.requestHeaderSize" deprecated="jetty.request.header.size" default="8192" /></Set>
<Set name="responseHeaderSize"><Property name="jetty.httpConfig.responseHeaderSize" deprecated="jetty.response.header.size" default="8192" /></Set>
<Set name="sendServerVersion"><Property name="jetty.httpConfig.sendServerVersion" deprecated="jetty.send.server.version" default="true" /></Set>
<Set name="sendDateHeader"><Property name="jetty.httpConfig.sendDateHeader" deprecated="jetty.send.date.header" default="false" /></Set>
<Set name="headerCacheSize"><Property name="jetty.httpConfig.headerCacheSize" default="1024" /></Set>
<Set name="delayDispatchUntilContent"><Property name="jetty.httpConfig.delayDispatchUntilContent" deprecated="jetty.delayDispatchUntilContent" default="true"/></Set>
<Set name="maxErrorDispatches"><Property name="jetty.httpConfig.maxErrorDispatches" default="10"/></Set>
<Set name="blockingTimeout"><Property deprecated="jetty.httpConfig.blockingTimeout" name="jetty.httpConfig.blockingTimeout.DEPRECATED" default="-1"/></Set>
<Set name="persistentConnectionsEnabled"><Property name="jetty.httpConfig.persistentConnectionsEnabled" default="true"/></Set>
<Set name="requestCookieCompliance"><Call class="org.eclipse.jetty.http.CookieCompliance" name="valueOf"><Arg><Property name="jetty.httpConfig.requestCookieCompliance" deprecated="jetty.httpConfig.cookieCompliance" default="RFC6265"/></Arg></Call></Set>
<Set name="responseCookieCompliance"><Call class="org.eclipse.jetty.http.CookieCompliance" name="valueOf"><Arg><Property name="jetty.httpConfig.responseCookieCompliance" default="RFC6265"/></Arg></Call></Set>
<Set name="multiPartFormDataCompliance"><Call class="org.eclipse.jetty.server.MultiPartFormDataCompliance" name="valueOf"><Arg><Property name="jetty.httpConfig.multiPartFormDataCompliance" default="RFC7578"/></Arg></Call></Set>
<Set name="relativeRedirectAllowed"><Property name="jetty.httpConfig.relativeRedirectAllowed" default="false"/></Set>
<Call name="addCustomizer">
<Arg>
(省略)
<Arg><Ref refid="httpConfig"/></Arg> の部分を削除していることによりhttp-forwardedモジュールの他rewriteモジュールの設定がBack-Channelに反映されない可能性がありますのでご注意ください。Back-Channelに対するこれらのモジュールの使用は避けてください。
4.有効化
/opt/shibboleth-idp/conf/relying-party.xml ファイルを以下のように修正します。
以下ではSAML 1.x自体の有効化(デフォルトでは無効)も行っておりますが、SAML 2.0 Attribute Queryのみ必要な場合は前半のコメント解除は不要です。
<bean id="shibboleth.DefaultRelyingParty" parent="RelyingParty">
<property name="profileConfigurations">
<list>
<!-- SAML 1.1 and SAML 2.0 AttributeQuery are disabled by default. -->
<!-- --> ← コメントを解除
<bean parent="Shibboleth.SSO" p:postAuthenticationFlows="attribute-release" />
<ref bean="SAML1.AttributeQuery" />
<ref bean="SAML1.ArtifactResolution" />
<!-- --> ← コメントを解除
<bean parent="SAML2.SSO" p:postAuthenticationFlows="attribute-release" />
<ref bean="SAML2.ECP" />
<ref bean="SAML2.Logout" />
<!-- --> ← コメントを解除
<ref bean="SAML2.AttributeQuery" />
<!-- --> ← コメントを解除
<ref bean="SAML2.ArtifactResolution" />
<ref bean="Liberty.SSOS" />
</list>
</property>
</bean>
設定変更後は、Jettyの再起動を行います。
# systemctl restart jetty
[root@ip-10-0-0-65 conf]# systemctl start jetty
Job for jetty.service failed because the control process exited with error code.
See "systemctl status jetty.service" and "journalctl -xeu jetty.service" for details.
[root@ip-10-0-0-65 conf]# systemctl status jetty.service
× jetty.service - Jetty Web Application Server
Loaded: loaded (/etc/systemd/system/jetty.service; disabled; preset: disabled)
Active: failed (Result: exit-code) since Thu 2024-08-01 19:21:03 JST; 48s ago
Process: 20177 ExecStart=/etc/init.d/jetty start (code=exited, status=1/FAILURE)
CPU: 3.317s
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: at java.base/jav>
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: at org.eclipse.j>
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: ... 6 more
Aug 01 19:21:03 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20177]: ................................>
Aug 01 19:21:03 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20177]: ** ERROR: Server process is NOT >
Aug 01 19:21:03 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20177]: FAILED Thu Aug 1 07:21:03 PM JS>
Aug 01 19:21:03 ip-10-0-0-65.ap-northeast-1.compute.internal systemd[1]: jetty.service: Control process exi>
Aug 01 19:21:03 ip-10-0-0-65.ap-northeast-1.compute.internal systemd[1]: jetty.service: Failed with result >
Aug 01 19:21:03 ip-10-0-0-65.ap-northeast-1.compute.internal systemd[1]: Failed to start Jetty Web Applicat>
Aug 01 19:21:03 ip-10-0-0-65.ap-northeast-1.compute.internal systemd[1]: jetty.service: Consumed 3.317s CPU>
Aug 01 19:19:02 ip-10-0-0-65.ap-northeast-1.compute.internal systemd[1]: Starting Jetty Web Application Server...
aa Subject: A start job for unit jetty.service has begun execution
aa Defined-By: systemd
aa Support: https://wiki.rockylinux.org/rocky/support
aa
aa A start job for unit jetty.service has begun execution.
aa
aa The job identifier is 19074.
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20177]: Starting Jetty: ..
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: Exception in thread "main" java.lang.NoSuchMethodException: class org.eclipse.jetty.server.HttpConfiguration.setBlockingTimeout(class java.lang.String)
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.set(XmlConfiguration.java:759)
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:498)
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.newObj(XmlConfiguration.java:1028)
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:510)
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:457)
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: at org.eclipse.jetty.xml.XmlConfiguration.configure(XmlConfiguration.java:359)
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1900)
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: Suppressed: java.lang.NoSuchMethodException: org.eclipse.jetty.server.HttpConfiguration.setBlockingTimeout(java.lang.String)
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: at java.base/java.lang.Class.getMethod(Class.java:2227)
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.set(XmlConfiguration.java:610)
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: ... 6 more
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: Suppressed: java.lang.NoSuchFieldException: TYPE
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: at java.base/java.lang.Class.getField(Class.java:2117)
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.set(XmlConfiguration.java:623)
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: ... 6 more
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: Suppressed: java.lang.NoSuchFieldException: blockingTimeout
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: at java.base/java.lang.Class.getField(Class.java:2117)
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.set(XmlConfiguration.java:638)
Aug 01 19:19:04 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20224]: ... 6 more
Aug 01 19:21:03 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20177]: ...................................................................................................................... timeout
Aug 01 19:21:03 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20177]: ** ERROR: Server process is NOT running
Aug 01 19:21:03 ip-10-0-0-65.ap-northeast-1.compute.internal jetty[20177]: FAILED Thu Aug 1 07:21:03 PM JST 2024
Aug 01 19:21:03 ip-10-0-0-65.ap-northeast-1.compute.internal systemd[1]: jetty.service: Control process exited, code=exited, status=1/FAILURE
aa Subject: Unit process exited
aa Defined-By: systemd
aa Support: https://wiki.rockylinux.org/rocky/support
aa
aa An ExecStart= process belonging to unit jetty.service has exited.
aa
aa The process' exit code is 'exited' and its exit status is 1.
Aug 01 19:21:03 ip-10-0-0-65.ap-northeast-1.compute.internal systemd[1]: jetty.service: Failed with result 'exit-code'.
aa Subject: Unit failed
aa Defined-By: systemd
aa Support: https://wiki.rockylinux.org/rocky/support
aa
aa The unit jetty.service has entered the 'failed' state with result 'exit-code'.
Aug 01 19:21:03 ip-10-0-0-65.ap-northeast-1.compute.internal systemd[1]: Failed to start Jetty Web Application Server.
aa Subject: A start job for unit jetty.service has failed
aa Defined-By: systemd
aa Support: https://wiki.rockylinux.org/rocky/support
aa
aa A start job for unit jetty.service has finished with a failure.
aa
aa The job identifier is 19074 and the job result is failed.
Aug 01 19:21:03 ip-10-0-0-65.ap-northeast-1.compute.internal systemd[1]: jetty.service: Consumed 3.317s CPU time.
aa Subject: Resources consumed by unit runtime
aa Defined-By: systemd
aa Support: https://wiki.rockylinux.org/rocky/support
aa
aa The unit jetty.service completed and consumed the indicated resources.