ruby-samlでX509証明書の有効期限を取得したい

こんにちは!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です。

docs.ruby-lang.org

OneLogin::RubySaml::Settings#get_idp_certで取得した OpenSSL::X509::Certificate インスタンスに対して、not_afterメソッドを実行すればOKです。

github.com

$ 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 にしておく必要があります。

github.com


まとめ

not_before属性とnot_after属性を使用すれば簡単に証明証の有効期限のバリデーションがかけられそうです。