@@ -16,21 +16,109 @@ public static function getTestSignature()
1616
1717 /**
1818 * Get the path to the test public certificate
19+ * Creates a mock certificate if it doesn't exist
1920 *
2021 * @return string
2122 */
2223 public static function getTestPublicKeyPath ()
2324 {
24- return __DIR__ . '/certs/public.cer ' ;
25+ $ certPath = __DIR__ . '/certs/public.cer ' ;
26+ self ::ensureTestCertificatesExist ();
27+ return $ certPath ;
2528 }
2629
2730 /**
2831 * Get the path to the test private key
32+ * Creates a mock key if it doesn't exist
2933 *
3034 * @return string
3135 */
3236 public static function getTestPrivateKeyPath ()
3337 {
34- return __DIR__ . '/certs/private.key ' ;
38+ $ keyPath = __DIR__ . '/certs/private.key ' ;
39+ self ::ensureTestCertificatesExist ();
40+ return $ keyPath ;
41+ }
42+
43+ /**
44+ * Ensure test certificates exist, create them if they don't
45+ * This is particularly important for CI/CD environments
46+ *
47+ * @return void
48+ */
49+ private static function ensureTestCertificatesExist ()
50+ {
51+ $ certsDir = __DIR__ . '/certs ' ;
52+ $ publicCert = $ certsDir . '/public.cer ' ;
53+ $ privateKey = $ certsDir . '/private.key ' ;
54+
55+ // Create directory if it doesn't exist
56+ if (!is_dir ($ certsDir )) {
57+ mkdir ($ certsDir , 0755 , true );
58+ }
59+
60+ // Create private key if it doesn't exist
61+ if (!file_exists ($ privateKey )) {
62+ // Create a mock private key for testing
63+ $ privateKeyContent = <<<EOT
64+ -----BEGIN RSA PRIVATE KEY-----
65+ MIIEowIBAAKCAQEAvgm4DCU6BqKxmg0bWVsOLm+PAOAZyJGTnqmWPqYQHOiDCYBm
66+ FxHi7JdwW+09QmhU4yJFABP+CWnQPOkDu1J5YZyNLXXTKu3HxbGhpDmXgcTBgptz
67+ rJKTr1VjYGRJ0LL5/X/BcXCFa1CJXrOC4jLnMIGsNAGMCx9JgRyecggrG/FoELg7
68+ CQQM4X4vTYoKd3/QihP5MzQQCh/cNv/Z5zFvRuBGwJG1hI1CcGYFNAEUf0GCfxnk
69+ rONuzGF8FSKdkTrwLgVNE8YECpEDN1zRCDZ+/jLuQsJT1ER5Z//3ZgNuJiOTMZZL
70+ kKbjWT3oWLKdMPvONJxANpz1JLu0VvYQQTi5QwIDAQABAoIBAGmCVjvMQRX7nNcK
71+ fKCLnW33LzGvWTmdBQHEiF7nFJWOYdBvG7u6sTvMqxoHJUbPTacBQhJYtlQyj9FA
72+ XVyWyH1FrfQEEKFtGNoUDYcBZ+hJYLYDcJLQrSBBuuLCJ0RNZ5S8FU1+QgVLW/5Z
73+ rJUm8UPq5V9IWZKD0l8fUL5h6/l6qI7XIgGUTtR3nQRoIrBkjsTWOZFYjmJKGEQz
74+ DnxoYnZPOdQpI5OQlYKyVEW/QM8wBXN9Qoe7kqIq5K6JIFXoMNQoXG5R8oGzYBQl
75+ ZKYMkOOcJy4x1ZFQQsRQiYM/IqvK8gGnD9QYzSaxzj8YPQU7g9wEneQVgHdmp6Sm
76+ R9YG5YECgYEA+Qk6UEjdvmK8LLrMpYwFIWPKP/5GV9Qc+J89PN6t9LGg5ydXVyWK
77+ YKFYu2EMgzH98TdcVxhYYBTSBUEJQWXHYkxMsGpKcZgHLGvDSxRs2wuCKQZpAyoi
78+ CjLdlL/LJAQvnFkVCKgWZ5IqCUxeRHLlPRU5/XtLUPvPBZy0Ys0XP0MCgYEAw4OA
79+ OVKQcnwRvWnmB8yfgRSLRa+7dVnFc5VXW5SkOXXvVnNJXE/rQ18hF8jgS4lqwFpT
80+ QIXXRVIpXKxK6qNnNrCzVKzXgcR/ET2zCaX0jVyZaQ7Jth5ijCuKrNIUYyDyRlzb
81+ JY7+HdIRMuLLmGPTVjnANYqJEQEJcT+2/ZMsRiECgYEA8LsxNuGOGu4RWxMJH6WH
82+ chWKVpOQjHQYQOEbCJg0GCYx9DBaCMKQDpKV5fGpJxfHYGF+Qy9VWEGTr8TwUiQZ
83+ BDsC+oLqrH7IwgjFVxBwOYNS7xaQeKkzxFYoXRQxdz1XIJmzRXBh5F+WuaVNWFAJ
84+ WQp9FGldbFUloqXFAQnIXAMCgYBqIjKZVJwPJR3m/QUKKJnFGwhXLwWpvG1T9h9N
85+ QO9lq8kUXzJ7C2VDcRpvd8VkBmKrM5gJY9m/hPBvQ9wzF7zGvHuXgZQDQKYBzUVl
86+ FBVJDKRrGh4iK8V3ZrUDVVpzJRQCBBU7+mBR2gjyPNgfDxRAR0UzUVbZSRKj8JvL
87+ xNnbIQKBgHKvy7zyHqL0rG7yjawvVsRV9yqiQeX5dGYQTYnCUxvspGY0yfFgOGUh
88+ kFHKLbBkA0WnDG4l1ZqLDLEkU3lImFbZvl9KHnXQVW8jOTZHdVd3UJJJGIKYx4JQ
89+ QwgYZJOFrJwRYOKuaqLgSRbVTWVeVPZVGQzwQs+WGYCk6S0JJxZ4
90+ -----END RSA PRIVATE KEY-----
91+ EOT ;
92+ file_put_contents ($ privateKey , $ privateKeyContent );
93+ }
94+
95+ // Create public certificate if it doesn't exist
96+ if (!file_exists ($ publicCert )) {
97+ // Create a mock public certificate for testing
98+ $ publicCertContent = <<<EOT
99+ -----BEGIN CERTIFICATE-----
100+ MIIDazCCAlOgAwIBAgIUEMGJYgOLmVGTLN+aHJvMvZdFXHUwDQYJKoZIhvcNAQEL
101+ BQAwRTELMAkGA1UEBhMCVVMxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
102+ GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMzA1MjYwMDAwMDBaFw0zMzA1
103+ MjMwMDAwMDBaMEUxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
104+ HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEB
105+ AQUAA4IBDwAwggEKAoIBAQC+CbgMJToGorGaDRtZWw4ub48A4BnIkZOeqZY+phAc
106+ 6IMJgGYXEeLsl3Bb7T1CaFTjIkUAE/4JadA86QO7UnlhnI0tddMq7cfFsaGkOZeB
107+ xMGCm3OskpOvVWNgZEnQsvn9f8FxcIVrUIles4LiMucwgaw0AYwLH0mBHJ5yCCsb
108+ 8WgQuDsJBAzhfi9Nigp3f9CKE/kzNBAKH9w2/9nnMW9G4EbAkbWEjUJwZgU0ARR/
109+ QYJ/GeSs427MYXwVIp2ROvAuBU0TxgQKkQM3XNEINn7+Mu5CwlPURHln//dmA24m
110+ I5MxlkuQpuNZPehYsp0w+840nEA2nPUku7RW9hBBOLlDAgMBAAGjUzBRMB0GA1Ud
111+ DgQWBBQMRl7RD5kBRQUKF7dKLb0QE5iiKzAfBgNVHSMEGDAWgBQMRl7RD5kBRQUK
112+ F7dKLb0QE5iiKzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQB+
113+ F/fqsWFrT+TTu1VTytW3IQYvV7UbQIcJ/dCJKzJYKGbGhV5LWJ4cM4iBZ9SSt2oc
114+ OEZQN4Hx1nKWlxGPFJUzUQYRVGGt2MpF8wzMe0STnqP1MmQnbVwXpJXHVT4m4wXF
115+ FdSGEpbFwSrBlzkWEHgQkZBkGeyOYQhTGQV0X0qOCPCj9CfM5JC/6VxQkKQhtZZd
116+ kBppVwYkLRZwHZ5KXXJmVgpCQ+JrNEEVUu3SoJJ7m5ZQe0QO9bGqnCl1gKZkKYGQ
117+ QhyG+cCMJ/RVA4FAiPHQVpL1L+J+skZZqXZHh+zfYPKgXs1+WCLdI+Qgz6l1vPQZ
118+ YrxZbQF4QkJXTDPOZDuY
119+ -----END CERTIFICATE-----
120+ EOT ;
121+ file_put_contents ($ publicCert , $ publicCertContent );
122+ }
35123 }
36124}
0 commit comments