Skip to content

Commit 617ca56

Browse files
roadrunner2kares
authored andcommitted
Fix loading of Subject/Issuer-Alt-Name extensions. (#144)
These were being treated specially and incorrectly when being loaded from encoded values. A given extension may not occur more than once in certificate or CRL, and hence this code could never be correct. Fixed the erroneous test for this too.
1 parent b852b51 commit 617ca56

File tree

2 files changed

+6
-27
lines changed

2 files changed

+6
-27
lines changed

src/main/java/org/jruby/ext/openssl/X509Extension.java

-16
Original file line numberDiff line numberDiff line change
@@ -141,22 +141,6 @@ static X509Extension[] newExtension(final ThreadContext context,
141141
final ASN1ObjectIdentifier objectId = ASN1.getObjectID(runtime, oid);
142142
final ASN1Encodable value = ASN1.readObject(extValue);
143143

144-
if ( oid.equals("2.5.29.17") || oid.equals("2.5.29.18") ) { // subjectAltName || issuerAltName
145-
if ( value instanceof ASN1OctetString ) { // DEROctetString
146-
final ASN1Encodable oct = ASN1.readObject( ((ASN1OctetString) value).getOctets() );
147-
if ( oct instanceof ASN1Sequence ) {
148-
final ASN1Sequence seq = (ASN1Sequence) oct;
149-
final X509Extension[] ext = new X509Extension[ seq.size() ];
150-
for ( int i = 0; i < ext.length; i++ ) {
151-
ext[i] = newExtension(runtime, objectId, seq.getObjectAt(i), critical);
152-
}
153-
return ext;
154-
}
155-
// NOTE need to unwrap ((ASN1TaggedObject) oct).getObject() - likely not ?!?
156-
return new X509Extension[] { newExtension(runtime, objectId, oct, critical) };
157-
}
158-
}
159-
160144
return new X509Extension[] { newExtension(runtime, objectId, value, critical) };
161145
}
162146

src/test/ruby/x509/test_x509cert.rb

+6-11
Original file line numberDiff line numberDiff line change
@@ -82,25 +82,23 @@ def test_resolve_extensions
8282
[ "keyUsage", "keyCertSign, cRLSign", true ],
8383
[ "subjectKeyIdentifier", "hash", false ],
8484
[ "authorityKeyIdentifier", "keyid:always", false ],
85-
[ "subjectAltName", "email:[email protected]", false ],
86-
[ "subjectAltName", "DNS:jruby.org", false ],
85+
[ "subjectAltName", "email:[email protected], DNS:jruby.org", false ],
8786
]
8887

8988
now = Time.now
9089
ca_cert = issue_cert(ca, rsa2048, 1, now, now + 3600, ca_exts,
9190
nil, nil, OpenSSL::Digest::SHA1.new)
9291

93-
assert_equal 6, ca_cert.extensions.size
92+
assert_equal 5, ca_cert.extensions.size
9493

9594
cert = OpenSSL::X509::Certificate.new ca_cert.to_der
96-
assert_equal 6, cert.extensions.size
95+
assert_equal 5, cert.extensions.size
9796

9897
# Java 6/7 seems to maintain same order but Java 8 does definitely not :
9998
# TODO there must be something going on under - maybe not BC parsing ?!?
10099
if self.class.java6? || self.class.java7?
101100
assert_equal '97:39:9D:C3:FB:CD:BA:8F:54:0C:90:7B:46:3F:EA:D6:43:75:B1:CB', cert.extensions[2].value
102-
assert_equal 'email:[email protected]', cert.extensions[4].value
103-
assert_equal 'DNS:jruby.org', cert.extensions[5].value
101+
assert_equal 'email:[email protected], DNS:jruby.org', cert.extensions[4].value
104102
end
105103

106104
exts = cert.extensions.dup
@@ -118,10 +116,7 @@ def test_resolve_extensions
118116
assert ! ext.critical?
119117

120118
assert ext = exts.find { |e| e.oid == 'subjectAltName' }, "missing 'subjectAltName' among: #{exts.join(', ')}"
121-
assert_equal 'email:[email protected]', ext.value
122-
exts.delete(ext)
123-
assert ext = exts.find { |e| e.oid == 'subjectAltName' }, "missing 'subjectAltName' among: #{exts.join(', ')}"
124-
assert_equal 'DNS:jruby.org', ext.value
119+
assert_equal 'email:[email protected], DNS:jruby.org', ext.value
125120
end
126121

127122
def test_extensions
@@ -367,4 +362,4 @@ def test_cert_loading_regression
367362
-----END RSA PRIVATE KEY-----
368363
_end_of_pem_
369364

370-
end
365+
end

0 commit comments

Comments
 (0)