blob: 04b44b2361be06b5556e763cac450276cf6577a7 [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package ingress
import (
"crypto/tls"
"crypto/x509"
"fmt"
"net/http"
"time"
"github.com/onsi/ginkgo"
"github.com/stretchr/testify/assert"
"github.com/apache/apisix-ingress-controller/test/e2e/scaffold"
)
var _ = ginkgo.Describe("suite-ingress: SSL Testing", func() {
suites := func(scaffoldFunc func() *scaffold.Scaffold) {
s := scaffoldFunc()
ginkgo.It("create a SSL from ApisixTls ", func() {
secretName := "test-apisix-tls"
cert := `-----BEGIN CERTIFICATE-----
MIIDSjCCAjICCQC/34ZwGz7ZXjANBgkqhkiG9w0BAQsFADBmMQswCQYDVQQGEwJD
TjEQMA4GA1UECAwHSmlhbmdzdTEPMA0GA1UEBwwGU3V6aG91MQ8wDQYDVQQKDAZ6
aGlsaXUxEDAOBgNVBAsMB3NlY3Rpb24xETAPBgNVBAMMCHRlc3QuY29tMCAXDTIx
MDIwMzE0MjkwOVoYDzIwNTEwMTI3MTQyOTA5WjBmMQswCQYDVQQGEwJDTjEQMA4G
A1UECAwHSmlhbmdzdTEPMA0GA1UEBwwGU3V6aG91MQ8wDQYDVQQKDAZ6aGlsaXUx
EDAOBgNVBAsMB3NlY3Rpb24xETAPBgNVBAMMCHRlc3QuY29tMIIBIjANBgkqhkiG
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3DEQ5K9PVYicINTHt3arqrsrftrhotyBuGqM
xxqGMVO/E2SAa/81fC1UCcjYV4Wila0kl8i5fa8HjtVm5UWlrqxeFLOS3E0Wv2QY
w46BGZJY4InE9zKwYyC2DkBxE6p14JRjmtW/MQPNaOFjJ4bmCuRHsEzmQIGRM0b7
oKHjfFwv6l7BahgGf9ShHOMdHSkgWj6+2RU3282lrO9bY1JBTKu2Znv9M79nu1Px
Tn1wCfcuCwA7WQT/QSrE2R43I2vmbIbuSmeg9ivjMazRYQQ+qxQn/6zhiHvP3QZG
dKmp8imdYi+r84PKOLDEe/yxlgIdr2Au5WCPWwyYMYPWHzeD1wIDAQABMA0GCSqG
SIb3DQEBCwUAA4IBAQBYzNe83mPVuz96TZ3fmxtOIuz9b6q5JWiJiOzjAD9902Se
TNYzMM6T/5e0dBpj8Z2qQlhkfNxJJgTwGEE8SdrZIr8DhswR9a0bXDCZjLatCdeU
iYpt+TDAuySnLhAcd3GfE5ml6am2dOsOKpxHU/8clUSaz+21fckRopWo+xL6rSVC
4vvKqiU+LWLTZPQNoOqowl7bxoQO2jMWfN/5zvQOFxAbEufIPa9ti3qonDCXbkYn
PpET/mPDrcb4bGsZkW/cu0LrPSUVp12br5TAYaXqYS0Ex+jAVTXML9SeEQuvU3dH
5Uw2wVHxQXHglsdCYUXXFd3HZffb4rSQH+Mk0CBI
-----END CERTIFICATE-----`
key := `-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA3DEQ5K9PVYicINTHt3arqrsrftrhotyBuGqMxxqGMVO/E2SA
a/81fC1UCcjYV4Wila0kl8i5fa8HjtVm5UWlrqxeFLOS3E0Wv2QYw46BGZJY4InE
9zKwYyC2DkBxE6p14JRjmtW/MQPNaOFjJ4bmCuRHsEzmQIGRM0b7oKHjfFwv6l7B
ahgGf9ShHOMdHSkgWj6+2RU3282lrO9bY1JBTKu2Znv9M79nu1PxTn1wCfcuCwA7
WQT/QSrE2R43I2vmbIbuSmeg9ivjMazRYQQ+qxQn/6zhiHvP3QZGdKmp8imdYi+r
84PKOLDEe/yxlgIdr2Au5WCPWwyYMYPWHzeD1wIDAQABAoIBAQDGmSKpgE1H0k0v
d3siyFART3vtkLHOWKBPmxqaQhwixWwjq5QA1FCDTcbshFBMsGVyJpZIqGxVJdbl
RyjlRaooH6NDfKvLM2R+/2Mujot2av7qlpgmdXuODOTnecwDds2W33/vGTa2mL1e
CVuLPSqjTD40j0dlivdRjoZJ3Xn2oOrpZ812XU8KeZAjuSEAwcyl2nSbyLGDchBB
kfYZold3FaaLAf2LoVJ2fs+FwEPzDKoNYEvij9OyC0kwI94T5jQ+Z6XGtHXhb2Hy
Ek3EZeIhV3YcDIid5AjSvcrNtDI24hwszSmhYVc53EKYkpXHf581a3U/SEEhXDlw
Y0x6j9QRAoGBAPEP0LDgP7DGXxno4h+nf0AMru0pxlrNVQhLcNQB+dYI0pFTwsg+
AKenoaaE/EGR1KfiY0uf3rVWNrA5kyX1/i18iJx9LSf9NvNgMo84JVvXINgyE6sd
hvdqxFlV5FBnh8b7ldvYQy3YI0EQNx+/rmeUYPjInbkdiksAtAey4ADNAoGBAOnW
K0FoX1ljq3rc9uVasiRi6Ix50NHdZ17RcEpMgwWPenbP1aiWkvA8yFhU708lBaZC
WIUZ6XbfiG0Y9cMtxhtikoouDs5Ifia8juZ2bhkmSGP2FvZCBJJ/sHhnhpzSZNhW
SyLBUjnynoXwHoQvkoGnVTHAk1VsY7jLNJdr2MczAoGAMYvMmu4caRr8pPimsVbd
4q44reouKK+XUJMg55JYZVN+4/vRRxLnU44yvWUL6/YrPS5ctkhvn9nOd739rom2
6mZ0NaXMyDFVQAR/n8wscYnv6D+ypzL0cJnzLWFoAdalo5JGJN94P03zQQYyLkZZ
dFSc8cVaFZgqumu0lPiA7ekCgYEAiMeVL8Jcm84YXVrpNMmzkGMmwhzzT/8hWy5J
b7yHm3YM3Xi+8sl5E/uJ+VldTj9KqbD/VIQOs1EX3TEPeObKjfQ/4YIFeRagbAo5
0IcP6bgh+g7V6aA+Sm9Ui2mLLSpIgN8hPig0796CabhGMW4eVabKx7pstDgdsNd0
YOpduE8CgYEAu9k9WOQuRX4f6i5LBIxyaYn6Hw6oJn8e/w+p2+HNBXdyVQNqUHBG
V5rgnBwhc5LeIFbehKvQOvYSWbwbA1VunMpdYgV6+EBLayumJNqV6jGei4okx2of
wrw7im4TNSAdwVX4Y1F4svJ2as5SJn5QYGAzXDixNuwzXYrpP9rzA2s=
-----END RSA PRIVATE KEY-----`
// create secret
err := s.NewSecret(secretName, cert, key)
assert.Nil(ginkgo.GinkgoT(), err, "create secret error")
// create ApisixTls resource
tlsName := "tls-name"
host := "api6.com"
err = s.NewApisixTls(tlsName, host, secretName)
assert.Nil(ginkgo.GinkgoT(), err, "create tls error")
// check ssl in APISIX
time.Sleep(10 * time.Second)
tls, err := s.ListApisixSsl()
assert.Nil(ginkgo.GinkgoT(), err, "list tls error")
assert.Len(ginkgo.GinkgoT(), tls, 1, "tls number not expect")
})
ginkgo.It("update a SSL from ApisixTls ", func() {
secretName := "test-apisix-tls"
cert := `-----BEGIN CERTIFICATE-----
MIIDSDCCAjACCQDf02nwtW2VrzANBgkqhkiG9w0BAQsFADBmMQswCQYDVQQGEwJj
bjEQMA4GA1UECAwHamlhbmdzdTEPMA0GA1UEBwwGc3V6aG91MQ8wDQYDVQQKDAZ6
aGlsaXUxEDAOBgNVBAsMB3NlY3Rpb24xETAPBgNVBAMMCGFwaTYuY29tMB4XDTIx
MDEyNTA2MDQ0MVoXDTIxMDIyNDA2MDQ0MVowZjELMAkGA1UEBhMCY24xEDAOBgNV
BAgMB2ppYW5nc3UxDzANBgNVBAcMBnN1emhvdTEPMA0GA1UECgwGemhpbGl1MRAw
DgYDVQQLDAdzZWN0aW9uMREwDwYDVQQDDAhhcGk2LmNvbTCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAMQFzmobVVuixOa0cEItZLzt3gKifUS1b+sN5d0y
7SGKeApjhgSl0bl1xFXEGyFttCNlFU0+adbKHXJLsNFbO/l8xi+218ihYZ1mM708
8T8IJM4d4jpx0OKFZSU9two+VxNLTwFsat2GiB39KMiNpLOShhIdK9BKT8+v6Uqq
MbkYoCCRObcBsCuA7hhyteSdN7ccuxuMS28862R4gvhXGF2+BBXLnegzHE3PKexF
0vekJcfVH/LKS0iwl+Gcn6isJXQQTx6+llko+Flh7fqbrDIKV4EJm/5GfULJkjlp
SviTHJ5rJgZUjdkozA2O8ELpb3vsjEs44M+3h6v+AQ8LSrkCAwEAATANBgkqhkiG
9w0BAQsFAAOCAQEABt98FafJfmZ2Gaf/Fip9bf4qxGUlRfJpZ8K775VRSXAcI/by
Bh4wjd3DwUMVFFarx8CxcGHgjpK6bWE3tkQjc7R24xhPVaF/zyiPakrTHkWENHPZ
HbkOmZOY8wfZ8pPGUwHGA6bCmytWSD0lseEhxaHcZ27MmKI5CdUsgJXbc1q9gr3F
x4cosJI+W55Kzejiqgm/wzBbr4OpjW4DDz1YBJFXCc1TN9pf2ALkWZ8j3HfMrn2y
HvOefA8g628WpNtPZodWe/zC8hanCzRMp37JPbh85+RwlGhi7gIkhvjf78EiAZBy
eHg1iDgdVUzlXn+LNPCAbjxCaTqn6zmIb+GkhA==
-----END CERTIFICATE-----`
key := `-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAxAXOahtVW6LE5rRwQi1kvO3eAqJ9RLVv6w3l3TLtIYp4CmOG
BKXRuXXEVcQbIW20I2UVTT5p1sodckuw0Vs7+XzGL7bXyKFhnWYzvTzxPwgkzh3i
OnHQ4oVlJT23Cj5XE0tPAWxq3YaIHf0oyI2ks5KGEh0r0EpPz6/pSqoxuRigIJE5
twGwK4DuGHK15J03txy7G4xLbzzrZHiC+FcYXb4EFcud6DMcTc8p7EXS96Qlx9Uf
8spLSLCX4ZyfqKwldBBPHr6WWSj4WWHt+pusMgpXgQmb/kZ9QsmSOWlK+JMcnmsm
BlSN2SjMDY7wQulve+yMSzjgz7eHq/4BDwtKuQIDAQABAoIBAQCfVbTmDNfCR7lT
agIB2NIUvCkE7T1z1yNk5gQdXCLia6KNlz49kue5n596s4/2CS0uxCCfjAcN/3YW
DK5qToWekyypZi9aNsuY3JVb0iiqupzoKeRU62UGa7W+or6hBfFTjphmqNDoxkzo
S3qWIoRpLsXp/Wo6wdzEDdJMzbDjKVHUdcoeJ2IQdMG4dKKdf9NMZOhohZs+K0Kf
oroLTbrjCf5wI16KPxHVKe/6vw3098GKJc+MTfHtANJbwmI4dAlLcfbZ1I6VUoL6
JkCphK8BJ2jxeu0xTu7TXkHcMd/yK4pKmEQwjSpDOl0qWgFYAXJR2RHCaduR6w4l
XJcbnARtAoGBAPmwYjGHeCpzQdHA6Atkc9ETSdzfRShG7H/cRdluS6J4KEAJAFW7
i+Xc3rQf67CR/3JJgXObL1ZvQeIZ0Q0UD0WbBopJc2hfGRKN9lsFclMqDTzBHvvi
ZukE/IvL3elhtuskLyc9Wf0JGoEsdkQkMQT+wMyxbrZ6im2MWm/xswrnAoGBAMj6
LIysCK2LbOcPoi33nOGBC2ITUwhJGbbCeBho0xqpzcD20aQszJmYJkDng2WVkjdf
3MO2HDULA2JvEMdCrjvG5U1smLdbBQ89aIhy6clDKb5PMlOo9fo3E9ICyL5StFyy
09H0UGoCocZlBPOZQ70k5kLYOKf7QB9TeTyaIulfAoGAHDww7m7mTM6Zy9FnrBog
6qymtp5c4LAcgFz1XSAW13mE+7DI4+kAae7vFClj6qSn4VGknOEYmkqchafrtvHk
xDdCpxKlRVEzsaByElrsUbE4q/0ettckUgdpU5mrL4AIQlDmMCbE7VNBNwhDG3OI
Q4tXXA5YebQjwT2U4IHRgFMCgYEAxc82Od65S9aHAYUpowSrrGhOw+ExQF5yqKcP
fTbvULcAhIRqIqTVW/ec7xTvBvUITOhVaWu8p5iHZELcyMKgqsVAu8u/I/i6Kh3O
3T39TNKGK4HXjvAl6nh7UaDb5DeSvgpk4akN3MlqYNLc5MZdHbVLzU7ztKJeonaO
RU+QPRECgYB6XW24EI5+w3STbpnc6VoTS+sy9I9abTJPYo9LpCJwfMYc9Tg9Cx2K
29PnmSrLFpU2fvE0ijpyHRr7gGmINTxbrmTmfMBI01m+GpPuvDcBQ2tsFJ+A3DzN
9xJulR2NZUZdDIIIqx983ANE6S4Zb8rAbsoHQdqpjUrcVxI2OJBp3Q==
-----END RSA PRIVATE KEY-----`
// create secret
err := s.NewSecret(secretName, cert, key)
assert.Nil(ginkgo.GinkgoT(), err, "create secret error")
// create ApisixTls resource
tlsName := "tls-name"
host := "api6.com"
err = s.NewApisixTls(tlsName, host, secretName)
assert.Nil(ginkgo.GinkgoT(), err, "create tls error")
// update ApisixTls resource
host = "api7.com"
err = s.NewApisixTls(tlsName, host, secretName)
assert.Nil(ginkgo.GinkgoT(), err, "update tls error")
// check ssl in APISIX
time.Sleep(10 * time.Second)
tls, err := s.ListApisixSsl()
assert.Nil(ginkgo.GinkgoT(), err, "list tls error")
assert.Len(ginkgo.GinkgoT(), tls, 1, "tls number not expect")
assert.Equal(ginkgo.GinkgoT(), tls[0].Snis[0], host, "tls host is error")
assert.Equal(ginkgo.GinkgoT(), tls[0].Labels, map[string]string{
"managed-by": "apisix-ingress-controller",
})
})
ginkgo.It("delete a SSL from ApisixTls ", func() {
secretName := "test-apisix-tls"
cert := `-----BEGIN CERTIFICATE-----
MIIDSDCCAjACCQDf02nwtW2VrzANBgkqhkiG9w0BAQsFADBmMQswCQYDVQQGEwJj
bjEQMA4GA1UECAwHamlhbmdzdTEPMA0GA1UEBwwGc3V6aG91MQ8wDQYDVQQKDAZ6
aGlsaXUxEDAOBgNVBAsMB3NlY3Rpb24xETAPBgNVBAMMCGFwaTYuY29tMB4XDTIx
MDEyNTA2MDQ0MVoXDTIxMDIyNDA2MDQ0MVowZjELMAkGA1UEBhMCY24xEDAOBgNV
BAgMB2ppYW5nc3UxDzANBgNVBAcMBnN1emhvdTEPMA0GA1UECgwGemhpbGl1MRAw
DgYDVQQLDAdzZWN0aW9uMREwDwYDVQQDDAhhcGk2LmNvbTCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAMQFzmobVVuixOa0cEItZLzt3gKifUS1b+sN5d0y
7SGKeApjhgSl0bl1xFXEGyFttCNlFU0+adbKHXJLsNFbO/l8xi+218ihYZ1mM708
8T8IJM4d4jpx0OKFZSU9two+VxNLTwFsat2GiB39KMiNpLOShhIdK9BKT8+v6Uqq
MbkYoCCRObcBsCuA7hhyteSdN7ccuxuMS28862R4gvhXGF2+BBXLnegzHE3PKexF
0vekJcfVH/LKS0iwl+Gcn6isJXQQTx6+llko+Flh7fqbrDIKV4EJm/5GfULJkjlp
SviTHJ5rJgZUjdkozA2O8ELpb3vsjEs44M+3h6v+AQ8LSrkCAwEAATANBgkqhkiG
9w0BAQsFAAOCAQEABt98FafJfmZ2Gaf/Fip9bf4qxGUlRfJpZ8K775VRSXAcI/by
Bh4wjd3DwUMVFFarx8CxcGHgjpK6bWE3tkQjc7R24xhPVaF/zyiPakrTHkWENHPZ
HbkOmZOY8wfZ8pPGUwHGA6bCmytWSD0lseEhxaHcZ27MmKI5CdUsgJXbc1q9gr3F
x4cosJI+W55Kzejiqgm/wzBbr4OpjW4DDz1YBJFXCc1TN9pf2ALkWZ8j3HfMrn2y
HvOefA8g628WpNtPZodWe/zC8hanCzRMp37JPbh85+RwlGhi7gIkhvjf78EiAZBy
eHg1iDgdVUzlXn+LNPCAbjxCaTqn6zmIb+GkhA==
-----END CERTIFICATE-----`
key := `-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAxAXOahtVW6LE5rRwQi1kvO3eAqJ9RLVv6w3l3TLtIYp4CmOG
BKXRuXXEVcQbIW20I2UVTT5p1sodckuw0Vs7+XzGL7bXyKFhnWYzvTzxPwgkzh3i
OnHQ4oVlJT23Cj5XE0tPAWxq3YaIHf0oyI2ks5KGEh0r0EpPz6/pSqoxuRigIJE5
twGwK4DuGHK15J03txy7G4xLbzzrZHiC+FcYXb4EFcud6DMcTc8p7EXS96Qlx9Uf
8spLSLCX4ZyfqKwldBBPHr6WWSj4WWHt+pusMgpXgQmb/kZ9QsmSOWlK+JMcnmsm
BlSN2SjMDY7wQulve+yMSzjgz7eHq/4BDwtKuQIDAQABAoIBAQCfVbTmDNfCR7lT
agIB2NIUvCkE7T1z1yNk5gQdXCLia6KNlz49kue5n596s4/2CS0uxCCfjAcN/3YW
DK5qToWekyypZi9aNsuY3JVb0iiqupzoKeRU62UGa7W+or6hBfFTjphmqNDoxkzo
S3qWIoRpLsXp/Wo6wdzEDdJMzbDjKVHUdcoeJ2IQdMG4dKKdf9NMZOhohZs+K0Kf
oroLTbrjCf5wI16KPxHVKe/6vw3098GKJc+MTfHtANJbwmI4dAlLcfbZ1I6VUoL6
JkCphK8BJ2jxeu0xTu7TXkHcMd/yK4pKmEQwjSpDOl0qWgFYAXJR2RHCaduR6w4l
XJcbnARtAoGBAPmwYjGHeCpzQdHA6Atkc9ETSdzfRShG7H/cRdluS6J4KEAJAFW7
i+Xc3rQf67CR/3JJgXObL1ZvQeIZ0Q0UD0WbBopJc2hfGRKN9lsFclMqDTzBHvvi
ZukE/IvL3elhtuskLyc9Wf0JGoEsdkQkMQT+wMyxbrZ6im2MWm/xswrnAoGBAMj6
LIysCK2LbOcPoi33nOGBC2ITUwhJGbbCeBho0xqpzcD20aQszJmYJkDng2WVkjdf
3MO2HDULA2JvEMdCrjvG5U1smLdbBQ89aIhy6clDKb5PMlOo9fo3E9ICyL5StFyy
09H0UGoCocZlBPOZQ70k5kLYOKf7QB9TeTyaIulfAoGAHDww7m7mTM6Zy9FnrBog
6qymtp5c4LAcgFz1XSAW13mE+7DI4+kAae7vFClj6qSn4VGknOEYmkqchafrtvHk
xDdCpxKlRVEzsaByElrsUbE4q/0ettckUgdpU5mrL4AIQlDmMCbE7VNBNwhDG3OI
Q4tXXA5YebQjwT2U4IHRgFMCgYEAxc82Od65S9aHAYUpowSrrGhOw+ExQF5yqKcP
fTbvULcAhIRqIqTVW/ec7xTvBvUITOhVaWu8p5iHZELcyMKgqsVAu8u/I/i6Kh3O
3T39TNKGK4HXjvAl6nh7UaDb5DeSvgpk4akN3MlqYNLc5MZdHbVLzU7ztKJeonaO
RU+QPRECgYB6XW24EI5+w3STbpnc6VoTS+sy9I9abTJPYo9LpCJwfMYc9Tg9Cx2K
29PnmSrLFpU2fvE0ijpyHRr7gGmINTxbrmTmfMBI01m+GpPuvDcBQ2tsFJ+A3DzN
9xJulR2NZUZdDIIIqx983ANE6S4Zb8rAbsoHQdqpjUrcVxI2OJBp3Q==
-----END RSA PRIVATE KEY-----`
// create secret
err := s.NewSecret(secretName, cert, key)
assert.Nil(ginkgo.GinkgoT(), err, "create secret error")
// create ApisixTls resource
tlsName := "tls-name"
host := "api6.com"
err = s.NewApisixTls(tlsName, host, secretName)
assert.Nil(ginkgo.GinkgoT(), err, "create tls error")
// check ssl in APISIX
time.Sleep(10 * time.Second)
tls, err := s.ListApisixSsl()
assert.Nil(ginkgo.GinkgoT(), err, "list tls error")
assert.Len(ginkgo.GinkgoT(), tls, 1, "tls number not expect")
assert.Equal(ginkgo.GinkgoT(), tls[0].Snis[0], host, "tls host is error")
// delete ApisixTls
err = s.DeleteApisixTls(tlsName, host, secretName)
assert.Nil(ginkgo.GinkgoT(), err, "delete tls error")
// check ssl in APISIX
time.Sleep(10 * time.Second)
tls, err = s.ListApisixSsl()
assert.Nil(ginkgo.GinkgoT(), err, "list tls error")
assert.Len(ginkgo.GinkgoT(), tls, 0, "tls number not expect")
})
}
ginkgo.Describe("suite-ingress: scaffold v2beta3", func() {
suites(scaffold.NewDefaultScaffold)
})
ginkgo.Describe("suite-ingress: scaffold v2", func() {
suites(scaffold.NewDefaultV2Scaffold)
})
})
var _ = ginkgo.Describe("suite-ingress: ApisixTls mTLS Test", func() {
// RootCA -> Server
// RootCA -> UserCert
// These certs come from mTLS practice
rootCA := `-----BEGIN CERTIFICATE-----
MIIGEjCCA/qgAwIBAgIUJgGBjfayA0ZB+iWklvizaah7eq0wDQYJKoZIhvcNAQEL
BQAwgYgxCzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdC
ZWlqaW5nMRYwFAYDVQQKDA1BcGFjaGUtQVBJU0lYMRcwFQYDVQQDDA5BUElTSVgt
SW5ncmVzczEkMCIGCSqGSIb3DQEJARYVZGV2QGFwaXNpeC5hcGFjaGUub3JnMB4X
DTIyMDUzMDIzMTE0MVoXDTMyMDUyNzIzMTE0MVowgYgxCzAJBgNVBAYTAkNOMRAw
DgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdCZWlqaW5nMRYwFAYDVQQKDA1BcGFj
aGUtQVBJU0lYMRcwFQYDVQQDDA5BUElTSVgtSW5ncmVzczEkMCIGCSqGSIb3DQEJ
ARYVZGV2QGFwaXNpeC5hcGFjaGUub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEArikPh5fAuFOOYZGoYp3DR8wrWE5hM02/OeOykj0gPXPUsU8/VWd6
stYjGu62hA1MY1hxWbzN7BDnIo/irOhJu1d1pSeRiGlEZAOqV7EKg0/t4ZrQr/TB
iUcQwiIIEVZwNKn1YWfTneq67vSMQ+jyMebyMkFIDGmApyayoZPEGtLSW8azqge+
wMvAayM3uCoeo1WUnX3oTV/VyNuPwcOzSwbHvJrAIkjnob68jkvZUNZPL5l50hGz
x+L7VnMVmzz9OVUCMEA/uZ7eM/bh1jPes56ySvyLMF0RDhKUdURRo6xWyGJRnZcs
B4AHJEHHahFJFoctKkCNP2gC9oLW8/sH7HwZWwfmS6Dn/YVe7dJznN0n78orPf0r
fgJCly2KGxeJFfPROsFMGfZ79NLL8Q3CylCc/hwpMLIVFBKA9NePmpKY/0TtYp8C
TSu+KENzAEvOPXw0o9Kmr+/oGaLzZW61OFh1GkpEQt2deDT3LBBiGbk7YMm8eLcg
DrsDhH1lumag00Xw34fL67jEt541OeekHBcw8kEgWHWmS5xepRTeVBu9xh8HeoVp
kO2bF56teuh4jWkmclP/1gKD/kGt+2qPDNcyKXCjd45DxWa7/ryHiAqYuzgRHYs2
j+4GJlH/UNwc8kSHviyiVKVDU7lzgww4gUQEfaARk8/MjmX1fnZcqzMCAwEAAaNy
MHAwHQYDVR0OBBYEFCD4iZRLmy3bPxKyk8+46G6xHZ1aMB8GA1UdIwQYMBaAFCD4
iZRLmy3bPxKyk8+46G6xHZ1aMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0RBBYwFIIS
bXRscy5odHRwYmluLmxvY2FsMA0GCSqGSIb3DQEBCwUAA4ICAQCIgBcfghjJe1ZF
k+JdCn0aDUaNokChTuOlJ4CvT8hr/08xI8DGK8uVCzPDe1OPvc/0B9cYlguGlJIo
tOUtOdhulDRGmw4sGoOLRb9leZXtPdWoCNFZBhf0i5V+rQffFlZbdqu7fJcXCwFi
2xUA8O2Lqu/6T3GO27GRDAmL+Qfn1G4PHI/+tRy5P1DNC5qTaZM7pe5D9n2XJVaE
Z+PDsI3ZnY6s2raFM+6Yjq3l/S5F8HWkIv+C1RNp52Nq3UpL1qeG/XuOLot1lI0t
wWTFYdCcyFGJRyW0V/Bk/PNlZ24wvXv2O+4xRVc139+VumDCb/qopVyHvkjLRUL3
ILHa0AUJF8LF4Sh5NloPeE+p8y2f/fY5tCdr4Tz8/mLx8APrf2wbXH07lwI7F3TC
bGkmSA9GqyVdZiM1XDyBKYpfJInzjOLPuzsd8xYAOJsg972jSD7oTHMKRiWkTEKC
WTUIkcN8dZO3CxthRAWvIuXhkpGoN3OYRBODkUW1aJ6+cP25icMYXSK6uBudOYpY
/yIdh6g3VCz7mN8KdEqeYKrw2cR0j01r1pqnh4YqLnC2TYar91MTK/6uQNPvaKIz
yL0TPM7LtpidKkHe49y9XWgRUGfmq+1/gFCY/Vk0xrXNcCJYpzoTMyZ9zEZFP2iu
djgSHn8f4ZS1qTtukbKsWFkq82jesw==
-----END CERTIFICATE-----
`
serverCertSecret := `server-secret`
serverCert := `-----BEGIN CERTIFICATE-----
MIIF0DCCA7igAwIBAgIUf2P2yoh6+RjG0ZJ72PNn7HbfKkcwDQYJKoZIhvcNAQEL
BQAwgYgxCzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdC
ZWlqaW5nMRYwFAYDVQQKDA1BcGFjaGUtQVBJU0lYMRcwFQYDVQQDDA5BUElTSVgt
SW5ncmVzczEkMCIGCSqGSIb3DQEJARYVZGV2QGFwaXNpeC5hcGFjaGUub3JnMB4X
DTIyMDUzMDIzMTMyMloXDTMyMDQwNzIzMTMyMlowgYwxCzAJBgNVBAYTAkNOMRAw
DgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdCZWlqaW5nMRYwFAYDVQQKDA1BcGFj
aGUtQVBJU0lYMRswGQYDVQQDDBJtdGxzLmh0dHBiaW4ubG9jYWwxJDAiBgkqhkiG
9w0BCQEWFWRldkBhcGlzaXguYXBhY2hlLm9yZzCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAKzseBvWEooy23QdRIIkKlKsMv720PiUeEIGsIGOjtNhcTSp
7e2zMw7kfrsvkmFUGdgajNCtQ3x/2jLncnS1kxKgS1ssOe0Fc5E7JuqiMtGPEhi3
6YjzWUYqPC9mSr27EdtYiNATTytZJs1Xa7VoElZjtOpxy5MEFz3HPCjafGCdpRFY
HEZ8vB890mPSEwOKspApYBPJfoUnby1n4PtMCt2xGeiaZ3NjNCqoS7OkCX9MjE4U
KYZc2nhZi7BfpasTB9s5UbEmaZoSpSCAjtT5dWPEPmo3vpzAxd7ol8nbXJC+p/oq
nVwhgiYc6wDHlSUDpua4lFoB9TBlN//saR+9/nfiT//YlgzlLrO92GmGIRzZNXzd
g5G1cbPJWK72wKAY9fVTcVhvc7XEfLj1Qd9LJdhqEzQe/VfLyITqGKA5pVNBA5aD
9Yb95fckgUq3me5Udb5dtE8Ua7oFF8ma4Vu9ao7bPujPdGFSb1NDc3T256HxhzQy
cNyH2/WvsceGlv29ADc87j8v5t5BURSUgWylgshyehFdQ63co66D6RW7nDokaMHL
UkRbm50EHZCjdSnRagra3UWKfjRK2JN631G6pXGyfncykzyV48qtmlzrboC9bb7T
8A30d18Z3ZiB3QO/eMCC4FK+6XqJvYzPMxYvkWMAe6AIz0Jbw918xEeUVfdJAgMB
AAGjLDAqMAkGA1UdEwQCMAAwHQYDVR0RBBYwFIISbXRscy5odHRwYmluLmxvY2Fs
MA0GCSqGSIb3DQEBCwUAA4ICAQCG9X4hl3Bnd5Pc0vYeUFo/FLkg8z6BnM2/fUmL
ty5uUAnU9NQOOQEKjQF4tU4o8+oexWlrjKXw//MOwpYAOJ3BrYNcqPOvX3mqhtVB
ULBzLhQeFxmbwQ7ZNoB2nh+7tH+Z/fqddVE3QPG4TxyEOHEa4Zr6WZ0Ienh9c9nW
GZGS3ggSNwdcxjapWPvwRNdFKylJTr57ebocoWc4NbRJxOny4E3Cl7yzT6MbYrsZ
R2QyjVKG7pi/gbq2fpFip+BG2PyV9HRba47KoxF/29LQkdr4R16afdcrPdXT5qCA
aDgEBHV7lHKz3yqGBrksB0LCG0MaT3mu80bhj4b5VhZ3ORrQ6gm1eyevJGZRaNgA
s7POltX9sxLcEQO6F7FWGXs2tq+gTl1KT23QuFj7UgVQ0SMrefR6GibAwHO0TFmN
HLlpYma1/zuU4QxI/+S+l4b6qx31TnUayRgOQn/J6vs+qZiD6fdugijQif4DsI3K
QBDwI9IxqyvgCleMbvlRfFFIENUpf+uWjkqOO/2yax3egvOfoCojt193vlXHxOjK
UROxuVcLmJgIUFR+KhqGibrk55oB5az7KVmV1OcUBhll6HI/SRDN/XRoJpDObczB
B3vZ3vLBZTgVBX+8TATMAaRhIoa1dupvOmBc0DQRibpWhJvpl4WPsQRMVFM3p1Kw
4e5kxA==
-----END CERTIFICATE-----
`
serverKey := `-----BEGIN PRIVATE KEY-----
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
3h0xluQw6uolHPequOpCJAbnSSfasUE=
-----END PRIVATE KEY-----
`
clientCASecret := `client-ca-secret`
clientCert := `-----BEGIN CERTIFICATE-----
MIIF0DCCA7igAwIBAgIUf2P2yoh6+RjG0ZJ72PNn7HbfKkgwDQYJKoZIhvcNAQEL
BQAwgYgxCzAJBgNVBAYTAkNOMRAwDgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdC
ZWlqaW5nMRYwFAYDVQQKDA1BcGFjaGUtQVBJU0lYMRcwFQYDVQQDDA5BUElTSVgt
SW5ncmVzczEkMCIGCSqGSIb3DQEJARYVZGV2QGFwaXNpeC5hcGFjaGUub3JnMB4X
DTIyMDUzMDIzMTY0NloXDTMyMDQwNzIzMTY0NlowgYwxCzAJBgNVBAYTAkNOMRAw
DgYDVQQIDAdCZWlqaW5nMRAwDgYDVQQHDAdCZWlqaW5nMRYwFAYDVQQKDA1BcGFj
aGUtQVBJU0lYMRswGQYDVQQDDBJtdGxzLmh0dHBiaW4ubG9jYWwxJDAiBgkqhkiG
9w0BCQEWFWRldkBhcGlzaXguYXBhY2hlLm9yZzCCAiIwDQYJKoZIhvcNAQEBBQAD
ggIPADCCAgoCggIBAJzowwrITI3QTFjyADv6zoBAQFZ9Z5qcmvVFsEjdp97THFop
MdImJ4qobZgKKwaYjQAopOTSqnU+WYlVFRyNTv4xOBbSWPx7xyed6IFWjg6U3DEE
0N+pswg6sa9LtLNVl3Ddw+54YL1IZTLnCmP380nI0neh90sqFqMBN8SnmwGKfO4W
T6/sosRr5ZQ+31FJW/BrguWbpLE79I71Un0+hjkCJbwPQaUrSBhVcy928VAvHLOL
twdm6QPcFAtQORKRsTyBT6aXyImP9VHxQs+a0kM8gHvtwC2PkD5Ekag3hP5hHtV/
Xc3mganw0UJOaWzEkhVhw5i2byDxfXPx6fd8lO6gowU2jV1LeT9j3kFQf1Jor2mT
S2xTeCur771jFSMyCKjFrE5ePeTzyrUrJ4t9LB1ynocEXbWH63EobMYU5uW/UPaK
svNZihHiX+xntJPDXK5w3pm9m4q4kJm3PXqXjXpN5G9LHliP9T+c/oCnf46iT4om
yq2sWegsr+V7GfT4w44/1S/eMklf3fz2BbOCnk53aQDfqAmCBFLttddn0l1yWo8P
e4saEpbu4W8uqaIjs7rZstKaxbTb4rbsHHORSc8Rvp12lmq0tdH1GnCJrkpluxYP
2hn/6KgLQuPT1WkQeAkxrinlbuHk4MpqU8dglwhUnKVUbLIjYBpklGp+axxPAgMB
AAGjLDAqMAkGA1UdEwQCMAAwHQYDVR0RBBYwFIISbXRscy5odHRwYmluLmxvY2Fs
MA0GCSqGSIb3DQEBCwUAA4ICAQBrAYU/4+TDDD5qyeMoS/a86SRcd3+idphz8G2E
8AAb7m+AGx6CDrmlloF8x7O3AHfmpgv8WZUx8gtVfC0hyWMUuoi98EA/5IdEVFTZ
/4vpKtLrXtuUBlV1hiWOFpLlt6tOZW7jLJRemwZXvGvETvp6hJZwek5v/AU5Eq9E
DCAjvs8uEOIWTflXanBe92tCGfhq6XzpRd3kQi/NZy7V3yCoqqXRLCz7rd9OtN32
KBYAprIFJ75BlwoZ5e8AArVQ5InSfJEx/oLbymSitIjSJn+R7psofwEs6mXNGN5H
ednGWq7l5bhp5mbYBEbwHmb9lOSfRtT7s4/SCgkJWTieU5klowF+RvSkjbbhOcaK
x/DQJTrnayCQpaRQThLEkk91vxr70WnsSvO0PxZ6lYJN1m5xD5V6iid4OKHbqMf2
yiYrma8Cdaf2ClQjrfgpNyXG9uB4j2uj9hSivsVTrKdhMdNID83O6ushcEhGufy9
8ADLg7w6Oe6DNQufcegNFXaVX2AqN92MlGBLEJc1WwLk3q2Nac9gT1JbxgJdZeLv
xoTwnu2/Tu1HVOUPemgG/0GwaePLFKxrhQWNIV69v17aj4QwnbbovQRKGtAP2fsk
JY6zpF5d11iGwCSS3GnoIUKn7Xo4g/V5Xf5YcP2UPAGLGGxS+zE52mVemVpY9ZqS
ZxAoPg==
-----END CERTIFICATE-----
`
clientKey := `-----BEGIN PRIVATE KEY-----
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
yXwQ0N/qK7uMh9w0d+yac8h8bjMa
-----END PRIVATE KEY-----
`
suites := func(scaffoldFunc func() *scaffold.Scaffold) {
s := scaffoldFunc()
ginkgo.It("create a SSL with client CA", func() {
// create secrets
err := s.NewSecret(serverCertSecret, serverCert, serverKey)
assert.Nil(ginkgo.GinkgoT(), err, "create server cert secret error")
err = s.NewClientCASecret(clientCASecret, rootCA, "")
assert.Nil(ginkgo.GinkgoT(), err, "create client CA cert secret error")
// create ApisixTls resource
tlsName := "tls-with-client-ca"
host := "mtls.httpbin.local"
err = s.NewApisixTlsWithClientCA(tlsName, host, serverCertSecret, clientCASecret)
assert.Nil(ginkgo.GinkgoT(), err, "create ApisixTls with client CA error")
// check ssl in APISIX
time.Sleep(10 * time.Second)
apisixSsls, err := s.ListApisixSsl()
assert.Nil(ginkgo.GinkgoT(), err, "list ssl error")
assert.Len(ginkgo.GinkgoT(), apisixSsls, 1, "ssl number not expect")
// create route
backendSvc, backendSvcPort := s.DefaultHTTPBackend()
apisixRoute := fmt.Sprintf(`
apiVersion: apisix.apache.org/v2beta3
kind: ApisixRoute
metadata:
name: httpbin-route
spec:
http:
- name: rule1
match:
hosts:
- mtls.httpbin.local
paths:
- /*
backends:
- serviceName: %s
servicePort: %d
`, backendSvc, backendSvcPort[0])
assert.Nil(ginkgo.GinkgoT(), s.CreateResourceFromString(apisixRoute))
time.Sleep(10 * time.Second)
apisixRoutes, err := s.ListApisixRoutes()
assert.Nil(ginkgo.GinkgoT(), err, "list routes error")
assert.Len(ginkgo.GinkgoT(), apisixRoutes, 1, "route number not expect")
// Without Client Cert
s.NewAPISIXHttpsClient(host).GET("/ip").WithHeader("Host", host).Expect().Status(http.StatusBadRequest).Body().Raw()
// With client cert
caCertPool := x509.NewCertPool()
ok := caCertPool.AppendCertsFromPEM([]byte(rootCA))
assert.True(ginkgo.GinkgoT(), ok, "Append cert to CA pool")
cert, err := tls.X509KeyPair([]byte(clientCert), []byte(clientKey))
assert.Nil(ginkgo.GinkgoT(), err, "generate cert")
s.NewAPISIXHttpsClientWithCertificates(host, true, caCertPool, []tls.Certificate{cert}).
GET("/ip").WithHeader("Host", host).Expect().Status(http.StatusOK)
})
}
ginkgo.Describe("suite-ingress: scaffold v2beta3", func() {
suites(scaffold.NewDefaultScaffold)
})
ginkgo.Describe("suite-ingress: scaffold v2", func() {
suites(scaffold.NewDefaultV2Scaffold)
})
})