@@ -126,4 +126,34 @@ def test_to_der_is_the_same_for_non_critical
126
126
assert ext1 . to_der != ext2 . to_der
127
127
end
128
128
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
+
129
159
end
0 commit comments