Class: WSDL::Security::Verifier
- Inherits:
-
Object
- Object
- WSDL::Security::Verifier
- Defined in:
- lib/wsdl/security/verifier.rb,
lib/wsdl/security/verifier/base.rb,
lib/wsdl/security/verifier/reference_validator.rb,
lib/wsdl/security/verifier/signature_validator.rb,
lib/wsdl/security/verifier/structure_validator.rb,
lib/wsdl/security/verifier/timestamp_validator.rb,
lib/wsdl/security/verifier/certificate_resolver.rb,
lib/wsdl/security/verifier/certificate_validator.rb,
lib/wsdl/security/verifier/element_position_validator.rb
Overview
Verifies XML Digital Signatures and timestamps in SOAP responses.
This class coordinates multiple validation steps to provide comprehensive security verification including:
- Structural Validation — Detects XML Signature Wrapping (XSW) attacks
- Certificate Resolution — Extracts or validates signing certificates
- Certificate Validation — Checks validity period and trust chain
- Reference Verification — Validates digests of signed elements
- Signature Verification — Cryptographic validation of SignatureValue
- Timestamp Validation — Freshness checks to prevent replay attacks
The verification process follows W3C XML Signature Best Practices, running structural checks before expensive cryptographic operations.
Defined Under Namespace
Classes: Base, CertificateResolver, CertificateValidator, ElementPositionValidator, ReferenceValidator, SignatureValidator, StructureValidator, TimestampValidator
Constant Summary collapse
- SecurityNS =
Local aliases for namespace constants
Constants::NS::Security
- SignatureNS =
Alias for XML Signature namespace constants.
Constants::NS::Signature
Instance Attribute Summary collapse
-
#certificate ⇒ OpenSSL::X509::Certificate?
readonly
Certificate used for verification.
-
#errors ⇒ Array<String>
readonly
Errors encountered during verification.
Instance Method Summary collapse
-
#digest_algorithm ⇒ String?
Returns the digest algorithm URI from the first reference.
-
#initialize(xml, certificate: nil, trust_store: nil, check_validity: true, validate_timestamp: true, clock_skew: 300) ⇒ Verifier
constructor
Creates a new Verifier instance.
-
#signature_algorithm ⇒ String?
Returns the signature algorithm URI.
-
#signature_present? ⇒ Boolean
Returns whether a signature is present in the document.
-
#signed_element_ids ⇒ Array<String>
Returns the IDs of all signed elements.
-
#signed_elements ⇒ Array<String>
Returns the names of all signed elements.
-
#timestamp ⇒ Hash?
Returns the parsed timestamp information.
-
#timestamp_errors ⇒ Array<String>
Returns timestamp validation errors.
-
#timestamp_present? ⇒ Boolean
Returns whether a timestamp is present in the document.
-
#timestamp_valid? ⇒ Boolean
Returns whether the timestamp is valid (fresh).
-
#valid? ⇒ Boolean
Returns whether the signature (and timestamp, if enabled) is valid.
Constructor Details
#initialize(xml, certificate: nil, trust_store: nil, check_validity: true, validate_timestamp: true, clock_skew: 300) ⇒ Verifier
Creates a new Verifier instance.
rubocop:disable Metrics/ParameterLists
97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/wsdl/security/verifier.rb', line 97 def initialize(xml, certificate: nil, trust_store: nil, check_validity: true, validate_timestamp: true, clock_skew: 300) # rubocop:enable Metrics/ParameterLists @document = parse_document(xml) @provided_certificate = certificate @trust_store = trust_store @check_validity = check_validity = @clock_skew = clock_skew @errors = [] @verified = nil @certificate = normalize_certificate(certificate) if certificate end |
Instance Attribute Details
#certificate ⇒ OpenSSL::X509::Certificate? (readonly)
Returns certificate used for verification.
75 76 77 |
# File 'lib/wsdl/security/verifier.rb', line 75 def certificate @certificate end |
#errors ⇒ Array<String> (readonly)
Returns errors encountered during verification.
72 73 74 |
# File 'lib/wsdl/security/verifier.rb', line 72 def errors @errors end |
Instance Method Details
#digest_algorithm ⇒ String?
Returns the digest algorithm URI from the first reference.
161 162 163 |
# File 'lib/wsdl/security/verifier.rb', line 161 def digest_algorithm signed_info_node&.at_xpath('ds:Reference/ds:DigestMethod/@Algorithm', ns)&.value end |
#signature_algorithm ⇒ String?
Returns the signature algorithm URI.
154 155 156 |
# File 'lib/wsdl/security/verifier.rb', line 154 def signature_algorithm signature_validator&.signature_algorithm end |
#signature_present? ⇒ Boolean
Returns whether a signature is present in the document.
131 132 133 |
# File 'lib/wsdl/security/verifier.rb', line 131 def signature_present? structure_validator.signature_present? end |
#signed_element_ids ⇒ Array<String>
Returns the IDs of all signed elements.
138 139 140 141 142 |
# File 'lib/wsdl/security/verifier.rb', line 138 def signed_element_ids return [] unless signature_present? reference_validator.referenced_ids end |
#signed_elements ⇒ Array<String>
Returns the names of all signed elements.
147 148 149 |
# File 'lib/wsdl/security/verifier.rb', line 147 def signed_elements signed_element_ids.filter_map { |id| safe_find_element_by_id(id)&.name } end |
#timestamp ⇒ Hash?
Returns the parsed timestamp information.
187 188 189 |
# File 'lib/wsdl/security/verifier.rb', line 187 def . end |
#timestamp_errors ⇒ Array<String>
Returns timestamp validation errors.
This exposes timestamp-specific diagnostics from the memoized timestamp validator without rerunning a full verification pipeline.
197 198 199 200 201 |
# File 'lib/wsdl/security/verifier.rb', line 197 def validator = validator.valid? if validator.errors.empty? validator.errors.dup end |
#timestamp_present? ⇒ Boolean
Returns whether a timestamp is present in the document.
168 169 170 |
# File 'lib/wsdl/security/verifier.rb', line 168 def . end |
#timestamp_valid? ⇒ Boolean
Returns whether the timestamp is valid (fresh).
Returns true if:
- No timestamp is present (timestamps are optional per spec)
- Timestamp is present and within acceptable time bounds
179 180 181 |
# File 'lib/wsdl/security/verifier.rb', line 179 def .valid? end |
#valid? ⇒ Boolean
Returns whether the signature (and timestamp, if enabled) is valid.
Performs full verification including:
- Structural validation (XSW protection)
- Certificate resolution
- Certificate validation (validity period and chain)
- Reference digest verification
- Cryptographic signature verification
- Timestamp freshness validation (if enabled and timestamp present)
122 123 124 125 126 |
# File 'lib/wsdl/security/verifier.rb', line 122 def valid? return @verified unless @verified.nil? @verified = perform_verification end |