こんにちは!kossyです!
今回は ruby-saml でX509証明書の有効期限を取得する方法について、備忘録としてブログに残してみたいと思います。
環境
Ruby 2.6.9
Rails 6.0.4
ruby-saml 1.13.0
not_afterメソッド
結論から言うと、OpenSSL::X509::Certificate#not_afterメソッドを呼び出せばOKです。
OneLogin::RubySaml::Settings#get_idp_certで取得した OpenSSL::X509::Certificate インスタンスに対して、not_afterメソッドを実行すればOKです。
$ settings = Account.get_saml_settings('http://localhost:3000') $ certificate = settings.get_idp_cert => #<OpenSSL::X509::Certificate subject=#<OpenSSL::X509::Name CN=IDPNAME,L=SEONGNAM,C=JP>, issuer=#<OpenSSL::X509::Name CN=IDPNAME,L=SEONGNAM,C=JP>, serial=#<OpenSSL::BN 12343304055179801234>, not_before=2021-09-30 04:45:51 UTC, not_after=2026-09-29 04:45:51 UTC> $ certificate.not_after => 2026-09-29 04:45:51 UTC
ちなみに、ruby-samlには有効期限が切れているかどうかをチェックするメソッドが実装されています。
module OneLogin module RubySaml # SAML2 Auxiliary class # class Utils @@uuid_generator = UUID.new if RUBY_VERSION < '1.9' DSIG = "http://www.w3.org/2000/09/xmldsig#" XENC = "http://www.w3.org/2001/04/xmlenc#" DURATION_FORMAT = %r(^(-?)P(?:(?:(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?)?)|(?:(\d+)W))$) # Checks if the x509 cert provided is expired # # @param cert [Certificate] The x509 certificate # def self.is_cert_expired(cert) if cert.is_a?(String) cert = OpenSSL::X509::Certificate.new(cert) end return cert.not_after < Time.now end # 省略
なお、ruby-samlでは証明書の有効期限チェックはデフォルトでfalseになっているので、もし有効期限チェックをGem側で行いたい場合は
明示的に true にしておく必要があります。
まとめ
not_before属性とnot_after属性を使用すれば簡単に証明証の有効期限のバリデーションがかけられそうです。