@@ -28,6 +28,39 @@ import {
2828import { isWindows } from '../../shared/utils'
2929import type { CommonServerOptions , ResolvedServerUrls } from '..'
3030
31+ // Test certificate for SAN parsing (localhost, foo.localhost, *.vite.localhost)
32+ // Generate once:
33+ // openssl req -x509 -nodes -newkey rsa:2048 -days 365 -subj "/CN=example.org" \
34+ // -addext "subjectAltName=DNS:localhost,DNS:foo.localhost,DNS:*.vite.localhost" \
35+ // -keyout /tmp/test.key -out /tmp/test.crt
36+ // Paste /tmp/test.crt below.
37+ const WORKING_TEST_CERT = `
38+ -----BEGIN CERTIFICATE-----
39+ MIID7zCCAtegAwIBAgIJS9D2rIN7tA8mMA0GCSqGSIb3DQEBCwUAMGkxFDASBgNV
40+ BAMTC2V4YW1wbGUub3JnMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWEx
41+ EzARBgNVBAcTCkJsYWNrc2J1cmcxDTALBgNVBAoTBFRlc3QxDTALBgNVBAsTBFRl
42+ c3QwHhcNMjUwMTMwMDQxNTI1WhcNMjUwMzAxMDQxNTI1WjBpMRQwEgYDVQQDEwtl
43+ eGFtcGxlLm9yZzELMAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRMwEQYD
44+ VQQHEwpCbGFja3NidXJnMQ0wCwYDVQQKEwRUZXN0MQ0wCwYDVQQLEwRUZXN0MIIB
45+ IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxNPlCqTmUZ7/F7GyFWDopqZ6
46+ w19Y7/98B10JEeFGTAQIj/RP2UgZNcTABQDUvtkF7y+bOeoVJW7Zz8ozQYhRaDp8
47+ CN2gXMcYeTUku/pKLXyCzHHVrOPAXTeU7sMRgLvPCrrJtx5OjvndW+O/PhohPRi3
48+ iEpPvpM8gi7MVRGhnWVSx0/Ynx5c0+/vqyBTzrM2OX7Ufg8Nv7LaTXpCAnmIQp+f
49+ Sqq7HZ7t6Y7laS4RApityvlnFHZ4f2cEibAKv/vXLED7bgAlGb8R1viPRdMtAPuI
50+ MYvHBgGFjyX1fmq6Mz3aqlAscJILtbQlwty1oYyaENE0lq8+nZXQ+t6I+CIVLQID
51+ AQABo4GZMIGWMAsGA1UdDwQEAwIC9DAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYB
52+ BQUHAwIGCCsGAQUFBwMDBggrBgEFBQcDCDBUBgNVHREETTBLgglsb2NhbGhvc3SC
53+ DWZvby5sb2NhbGhvc3SCECoudml0ZS5sb2NhbGhvc3SCBVs6OjFdhwR/AAABhxD+
54+ gAAAAAAAAAAAAAAAAAABMA0GCSqGSIb3DQEBCwUAA4IBAQBi302qLCgxWsUalgc2
55+ olFxVKob1xCciS8yUVX6HX0vza0WJ7oGW6qZsBbQtfgDwB/dHv7rwsfpjRWvFhmq
56+ gEUrewa1h0TIC+PPTYYz4M0LOwcLIWZLZr4am1eI7YP9NDgRdhfAfM4hw20vjf2a
57+ kYLKyRTC5+3/ly5opMq+CGLQ8/gnFxhP3ho8JYrRnqLeh3KCTGen3kmbAhD4IOJ9
58+ lxMwFPTTWLFFjxbXjXmt5cEiL2mpcq13VCF2HmheCen37CyYIkrwK9IfLhBd5QQh
59+ WEIBLwjKCAscrtyayXWp6zUTmgvb8PQf//3Mh2DiEngAi3WI/nL+8Y0RkqbvxBar
60+ X2JN
61+ -----END CERTIFICATE-----
62+ ` . trim ( ) as any
63+
3164describe ( 'bareImportRE' , ( ) => {
3265 test ( 'should work with normal package name' , ( ) => {
3366 expect ( bareImportRE . test ( 'vite' ) ) . toBe ( true )
@@ -220,33 +253,7 @@ describe('extractHostnamesFromSubjectAltName', () => {
220253 }
221254
222255 test ( 'should extract names from actual certificate' , ( ) => {
223- const certText = `
224- -----BEGIN CERTIFICATE-----
225- MIID7zCCAtegAwIBAgIJS9D2rIN7tA8mMA0GCSqGSIb3DQEBCwUAMGkxFDASBgNV
226- BAMTC2V4YW1wbGUub3JnMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWEx
227- EzARBgNVBAcTCkJsYWNrc2J1cmcxDTALBgNVBAoTBFRlc3QxDTALBgNVBAsTBFRl
228- c3QwHhcNMjUwMTMwMDQxNTI1WhcNMjUwMzAxMDQxNTI1WjBpMRQwEgYDVQQDEwtl
229- eGFtcGxlLm9yZzELMAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRMwEQYD
230- VQQHEwpCbGFja3NidXJnMQ0wCwYDVQQKEwRUZXN0MQ0wCwYDVQQLEwRUZXN0MIIB
231- IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxNPlCqTmUZ7/F7GyFWDopqZ6
232- w19Y7/98B10JEeFGTAQIj/RP2UgZNcTABQDUvtkF7y+bOeoVJW7Zz8ozQYhRaDp8
233- CN2gXMcYeTUku/pKLXyCzHHVrOPAXTeU7sMRgLvPCrrJtx5OjvndW+O/PhohPRi3
234- iEpPvpM8gi7MVRGhnWVSx0/Ynx5c0+/vqyBTzrM2OX7Ufg8Nv7LaTXpCAnmIQp+f
235- Sqq7HZ7t6Y7laS4RApityvlnFHZ4f2cEibAKv/vXLED7bgAlGb8R1viPRdMtAPuI
236- MYvHBgGFjyX1fmq6Mz3aqlAscJILtbQlwty1oYyaENE0lq8+nZXQ+t6I+CIVLQID
237- AQABo4GZMIGWMAsGA1UdDwQEAwIC9DAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYB
238- BQUHAwIGCCsGAQUFBwMDBggrBgEFBQcDCDBUBgNVHREETTBLgglsb2NhbGhvc3SC
239- DWZvby5sb2NhbGhvc3SCECoudml0ZS5sb2NhbGhvc3SCBVs6OjFdhwR/AAABhxD+
240- gAAAAAAAAAAAAAAAAAABMA0GCSqGSIb3DQEBCwUAA4IBAQBi302qLCgxWsUalgc2
241- olFxVKob1xCciS8yUVX6HX0vza0WJ7oGW6qZsBbQtfgDwB/dHv7rwsfpjRWvFhmq
242- gEUrewa1h0TIC+PPTYYz4M0LOwcLIWZLZr4am1eI7YP9NDgRdhfAfM4hw20vjf2a
243- kYLKyRTC5+3/ly5opMq+CGLQ8/gnFxhP3ho8JYrRnqLeh3KCTGen3kmbAhD4IOJ9
244- lxMwFPTTWLFFjxbXjXmt5cEiL2mpcq13VCF2HmheCen37CyYIkrwK9IfLhBd5QQh
245- WEIBLwjKCAscrtyayXWp6zUTmgvb8PQf//3Mh2DiEngAi3WI/nL+8Y0RkqbvxBar
246- X2JN
247- -----END CERTIFICATE-----
248- ` . trim ( )
249- const cert = new crypto . X509Certificate ( certText )
256+ const cert = new crypto . X509Certificate ( WORKING_TEST_CERT )
250257 expect (
251258 extractHostnamesFromSubjectAltName ( cert . subjectAltName ?? '' ) ,
252259 ) . toStrictEqual ( [
@@ -912,35 +919,8 @@ describe('getServerUrlByHost', () => {
912919} )
913920
914921describe ( 'extractHostnamesFromCerts' , ( ) => {
915- // Test certificate containing domains: 'localhost', 'foo.localhost', 'vite.vite.localhost',
916- const createWorkingCert = `-----BEGIN CERTIFICATE-----
917- MIID7zCCAtegAwIBAgIJS9D2rIN7tA8mMA0GCSqGSIb3DQEBCwUAMGkxFDASBgNV
918- BAMTC2V4YW1wbGUub3JnMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWEx
919- EzARBgNVBAcTCkJsYWNrc2J1cmcxDTALBgNVBAoTBFRlc3QxDTALBgNVBAsTBFRl
920- c3QwHhcNMjUwMTMwMDQxNTI1WhcNMjUwMzAxMDQxNTI1WjBpMRQwEgYDVQQDEwtl
921- eGFtcGxlLm9yZzELMAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRMwEQYD
922- VQQHEwpCbGFja3NidXJnMQ0wCwYDVQQKEwRUZXN0MQ0wCwYDVQQLEwRUZXN0MIIB
923- IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxNPlCqTmUZ7/F7GyFWDopqZ6
924- w19Y7/98B10JEeFGTAQIj/RP2UgZNcTABQDUvtkF7y+bOeoVJW7Zz8ozQYhRaDp8
925- CN2gXMcYeTUku/pKLXyCzHHVrOPAXTeU7sMRgLvPCrrJtx5OjvndW+O/PhohPRi3
926- iEpPvpM8gi7MVRGhnWVSx0/Ynx5c0+/vqyBTzrM2OX7Ufg8Nv7LaTXpCAnmIQp+f
927- Sqq7HZ7t6Y7laS4RApityvlnFHZ4f2cEibAKv/vXLED7bgAlGb8R1viPRdMtAPuI
928- MYvHBgGFjyX1fmq6Mz3aqlAscJILtbQlwty1oYyaENE0lq8+nZXQ+t6I+CIVLQID
929- AQABo4GZMIGWMAsGA1UdDwQEAwIC9DAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYB
930- BQUHAwIGCCsGAQUFBwMDBggrBgEFBQcDCDBUBgNVHREETTBLgglsb2NhbGhvc3SC
931- DWZvby5sb2NhbGhvc3SCECoudml0ZS5sb2NhbGhvc3SCBVs6OjFdhwR/AAABhxD+
932- gAAAAAAAAAAAAAAAAAABMA0GCSqGSIb3DQEBCwUAA4IBAQBi302qLCgxWsUalgc2
933- olFxVKob1xCciS8yUVX6HX0vza0WJ7oGW6qZsBbQtfgDwB/dHv7rwsfpjRWvFhmq
934- gEUrewa1h0TIC+PPTYYz4M0LOwcLIWZLZr4am1eI7YP9NDgRdhfAfM4hw20vjf2a
935- kYLKyRTC5+3/ly5opMq+CGLQ8/gnFxhP3ho8JYrRnqLeh3KCTGen3kmbAhD4IOJ9
936- lxMwFPTTWLFFjxbXjXmt5cEiL2mpcq13VCF2HmheCen37CyYIkrwK9IfLhBd5QQh
937- WEIBLwjKCAscrtyayXWp6zUTmgvb8PQf//3Mh2DiEngAi3WI/nL+8Y0RkwbvxBar
938- X2JN
939- -----END CERTIFICATE-----
940- ` . trim ( ) as any
941-
942922 test ( 'should extract hostnames from certificate' , ( ) => {
943- const httpsOptions = { cert : [ createWorkingCert ] } as any
923+ const httpsOptions = { cert : [ WORKING_TEST_CERT ] } as any
944924 const result = extractHostnamesFromCerts ( httpsOptions . cert )
945925
946926 expect ( result ) . toStrictEqual ( [
951931 } )
952932
953933 test ( 'should extract hostnames from multiple certificates' , ( ) => {
954- const httpsOptions = { cert : [ createWorkingCert , createWorkingCert ] } as any
934+ const httpsOptions = { cert : [ WORKING_TEST_CERT , WORKING_TEST_CERT ] } as any
955935 const result = extractHostnamesFromCerts ( httpsOptions . cert )
956936
957937 expect ( result ) . toStrictEqual ( [
@@ -977,33 +957,6 @@ describe('resolveServerUrls', () => {
977957 config : { rawBase : '/' } as any ,
978958 } )
979959
980- // Test certificate containing domains: 'localhost', 'foo.localhost', 'vite.vite.localhost',
981- const createWorkingCert = `-----BEGIN CERTIFICATE-----
982- MIID7zCCAtegAwIBAgIJS9D2rIN7tA8mMA0GCSqGSIb3DQEBCwUAMGkxFDASBgNV
983- BAMTC2V4YW1wbGUub3JnMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWEx
984- EzARBgNVBAcTCkJsYWNrc2J1cmcxDTALBgNVBAoTBFRlc3QxDTALBgNVBAsTBFRl
985- c3QwHhcNMjUwMTMwMDQxNTI1WhcNMjUwMzAxMDQxNTI1WjBpMRQwEgYDVQQDEwtl
986- eGFtcGxlLm9yZzELMAkGA1UEBhMCVVMxETAPBgNVBAgTCFZpcmdpbmlhMRMwEQYD
987- VQQHEwpCbGFja3NidXJnMQ0wCwYDVQQKEwRUZXN0MQ0wCwYDVQQLEwRUZXN0MIIB
988- IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxNPlCqTmUZ7/F7GyFWDopqZ6
989- w19Y7/98B10JEeFGTAQIj/RP2UgZNcTABQDUvtkF7y+bOeoVJW7Zz8ozQYhRaDp8
990- CN2gXMcYeTUku/pKLXyCzHHVrOPAXTeU7sMRgLvPCrrJtx5OjvndW+O/PhohPRi3
991- iEpPvpM8gi7MVRGhnWVSx0/Ynx5c0+/vqyBTzrM2OX7Ufg8Nv7LaTXpCAnmIQp+f
992- Sqq7HZ7t6Y7laS4RApityvlnFHZ4f2cEibAKv/vXLED7bgAlGb8R1viPRdMtAPuI
993- MYvHBgGFjyX1fmq6Mz3aqlAscJILtbQlwty1oYyaENE0lq8+nZXQ+t6I+CIVLQID
994- AQABo4GZMIGWMAsGA1UdDwQEAwIC9DAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYB
995- BQUHAwIGCCsGAQUFBwMDBggrBgEFBQcDCDBUBgNVHREETTBLgglsb2NhbGhvc3SC
996- DWZvby5sb2NhbGhvc3SCECoudml0ZS5sb2NhbGhvc3SCBVs6OjFdhwR/AAABhxD+
997- gAAAAAAAAAAAAAAAAAABMA0GCSqGSIb3DQEBCwUAA4IBAQBi302qLCgxWsUalgc2
998- olFxVKob1xCciS8yUVX6HX0vza0WJ7oGW6qZsBbQtfgDwB/dHv7rwsfpjRWvFhmq
999- gEUrewa1h0TIC+PPTYYz4M0LOwcLIWZLZr4am1eI7YP9NDgRdhfAfM4hw20vjf2a
1000- kYLKyRTC5+3/ly5opMq+CGLQ8/gnFxhP3ho8JYrRnqLeh3KCTGen3kmbAhD4IOJ9
1001- lxMwFPTTWLFFjxbXjXmt5cEiL2mpcq13VCF2HmheCen37CyYIkrwK9IfLhBd5QQh
1002- WEIBLwjKCAscrtyayXWp6zUTmgvb8PQf//3Mh2DiEngAi3WI/nL+8Y0RkwbvxBar
1003- X2JN
1004- -----END CERTIFICATE-----
1005- ` . trim ( ) as any
1006-
1007960 test ( 'should handle no certificate' , ( ) => {
1008961 const mockServer = createMockServer ( )
1009962 const { options, hostname, config } = createTestConfig ( )
@@ -1023,7 +976,7 @@ X2JN
1023976 test ( 'should handle IPv4 single certificate' , ( ) => {
1024977 const mockServer = createMockServer ( )
1025978 const { options, hostname, config } = createTestConfig ( )
1026- const httpsOptions = { cert : [ createWorkingCert ] }
979+ const httpsOptions = { cert : [ WORKING_TEST_CERT ] }
1027980
1028981 const result = resolveServerUrls (
1029982 mockServer ,
@@ -1041,7 +994,7 @@ X2JN
1041994 test ( 'should handle IPv4 multiple certificates' , ( ) => {
1042995 const mockServer = createMockServer ( )
1043996 const { options, hostname, config } = createTestConfig ( )
1044- const httpsOptions = { cert : [ createWorkingCert , createWorkingCert ] }
997+ const httpsOptions = { cert : [ WORKING_TEST_CERT , WORKING_TEST_CERT ] }
1045998
1046999 const result = resolveServerUrls (
10471000 mockServer ,
@@ -1059,7 +1012,7 @@ X2JN
10591012 test ( 'should handle IPv6 single certificate' , ( ) => {
10601013 const mockServer = createMockServer ( 'IPv6' , '::1' )
10611014 const { options, hostname, config } = createTestConfig ( )
1062- const httpsOptions = { cert : [ createWorkingCert ] }
1015+ const httpsOptions = { cert : [ WORKING_TEST_CERT ] }
10631016
10641017 const result = resolveServerUrls (
10651018 mockServer ,
@@ -1077,7 +1030,7 @@ X2JN
10771030 test ( 'should handle IPv6 multiple certificates' , ( ) => {
10781031 const mockServer = createMockServer ( 'IPv6' , '::1' )
10791032 const { options, hostname, config } = createTestConfig ( )
1080- const httpsOptions = { cert : [ createWorkingCert , createWorkingCert ] }
1033+ const httpsOptions = { cert : [ WORKING_TEST_CERT , WORKING_TEST_CERT ] }
10811034
10821035 const result = resolveServerUrls (
10831036 mockServer ,
0 commit comments