@@ -126,4 +126,34 @@ def test_to_der_is_the_same_for_non_critical
126126 assert ext1 . to_der != ext2 . to_der
127127 end
128128
129+ def test_subject_alt_name_sign_to_pem
130+ domain_list = 'test.example.com,test2.example.com,example.com,www.example.com'
131+
132+ rsa_key = OpenSSL ::PKey ::RSA . new ( 2048 )
133+ csr = OpenSSL ::X509 ::Request . new
134+ csr . subject = OpenSSL ::X509 ::Name . new [ [ "C" , 'AU' ] , [ "ST" , "NSW" ] , [ "O" , 'org' ] , [ "CN" , 'www.example.com' ] ]
135+ csr . public_key = rsa_key . public_key
136+
137+ extensions = OpenSSL ::ASN1 ::Set [ OpenSSL ::ASN1 ::Sequence ( [ subject_alt_name ( domain_list ) ] ) ]
138+ csr . add_attribute ( OpenSSL ::X509 ::Attribute . new ( 'extReq' , extensions ) )
139+ csr . add_attribute ( OpenSSL ::X509 ::Attribute . new ( 'msExtReq' , extensions ) )
140+
141+ csr . sign rsa_key , OpenSSL ::Digest ::SHA256 . new
142+
143+ puts csr . to_text if $VERBOSE
144+
145+ csr = OpenSSL ::X509 ::Request . new pem = csr . to_pem
146+ assert_equal 2 , csr . attributes . length
147+ ext_set = csr . attributes . first . value ; seq = ext_set . first . value
148+ assert_equal 'subjectAltName' , seq . first . value . first . value
149+ dns = seq . first . value . last . value
150+ assert dns =~ /test.example.com.*?test2.example.com.*?example.com.*?www.example.com/
151+ end
152+
153+ def subject_alt_name ( domains )
154+ ef = OpenSSL ::X509 ::ExtensionFactory . new
155+ ef . create_extension ( "subjectAltName" , domains . split ( ',' ) . map { |d | "DNS: #{ d } " } . join ( ',' ) )
156+ end
157+ private :subject_alt_name
158+
129159end
0 commit comments