@@ -24,6 +24,7 @@ import (
24
24
msgpackrpc "github.com/hashicorp/consul-net-rpc/net-rpc-msgpackrpc"
25
25
"github.com/hashicorp/consul-net-rpc/net/rpc"
26
26
27
+ "github.com/hashicorp/consul/acl"
27
28
"github.com/hashicorp/consul/agent/connect"
28
29
ca "github.com/hashicorp/consul/agent/connect/ca"
29
30
"github.com/hashicorp/consul/agent/consul/fsm"
@@ -1042,3 +1043,140 @@ func setupPrimaryCA(t *testing.T, client *vaultapi.Client, path string, rootPEM
1042
1043
require .NoError (t , err , "failed to set signed intermediate" )
1043
1044
return lib .EnsureTrailingNewline (buf .String ())
1044
1045
}
1046
+
1047
+ func TestCAManager_AuthorizeAndSignCertificate (t * testing.T ) {
1048
+ conf := DefaultConfig ()
1049
+ conf .PrimaryDatacenter = "dc1"
1050
+ conf .Datacenter = "dc2"
1051
+ manager := NewCAManager (nil , nil , testutil .Logger (t ), conf )
1052
+
1053
+ agentURL := connect.SpiffeIDAgent {
1054
+ Agent : "test-agent" ,
1055
+ Datacenter : conf .PrimaryDatacenter ,
1056
+ Host : "test-host" ,
1057
+ }.URI ()
1058
+ serviceURL := connect.SpiffeIDService {
1059
+ Datacenter : conf .PrimaryDatacenter ,
1060
+ Namespace : "ns1" ,
1061
+ Service : "test-service" ,
1062
+ }.URI ()
1063
+ meshURL := connect.SpiffeIDMeshGateway {
1064
+ Datacenter : conf .PrimaryDatacenter ,
1065
+ Host : "test-host" ,
1066
+ Partition : "test-partition" ,
1067
+ }.URI ()
1068
+
1069
+ tests := []struct {
1070
+ name string
1071
+ expectErr string
1072
+ getCSR func () * x509.CertificateRequest
1073
+ authAllow bool
1074
+ }{
1075
+ {
1076
+ name : "err_not_one_uri" ,
1077
+ expectErr : "CSR SAN contains an invalid number of URIs" ,
1078
+ getCSR : func () * x509.CertificateRequest {
1079
+ return & x509.CertificateRequest {
1080
+ URIs : []* url.URL {agentURL , agentURL },
1081
+ }
1082
+ },
1083
+ },
1084
+ {
1085
+ name : "err_email" ,
1086
+ expectErr : "CSR SAN does not allow specifying email addresses" ,
1087
+ getCSR : func () * x509.CertificateRequest {
1088
+ return & x509.CertificateRequest {
1089
+ URIs : []* url.URL {agentURL },
1090
+ EmailAddresses : []string {"test@example.com" },
1091
+ }
1092
+ },
1093
+ },
1094
+ {
1095
+ name : "err_invalid_spiffe_id" ,
1096
+ expectErr : "SPIFFE ID is not in the expected format" ,
1097
+ getCSR : func () * x509.CertificateRequest {
1098
+ return & x509.CertificateRequest {
1099
+ URIs : []* url.URL {connect.SpiffeIDAgent {}.URI ()},
1100
+ }
1101
+ },
1102
+ },
1103
+ {
1104
+ name : "err_service_write_not_allowed" ,
1105
+ expectErr : "Permission denied" ,
1106
+ getCSR : func () * x509.CertificateRequest {
1107
+ return & x509.CertificateRequest {
1108
+ URIs : []* url.URL {serviceURL },
1109
+ }
1110
+ },
1111
+ },
1112
+ {
1113
+ name : "err_service_different_dc" ,
1114
+ expectErr : "SPIFFE ID in CSR from a different datacenter" ,
1115
+ authAllow : true ,
1116
+ getCSR : func () * x509.CertificateRequest {
1117
+ return & x509.CertificateRequest {
1118
+ URIs : []* url.URL {serviceURL },
1119
+ }
1120
+ },
1121
+ },
1122
+ {
1123
+ name : "err_agent_write_not_allowed" ,
1124
+ expectErr : "Permission denied" ,
1125
+ getCSR : func () * x509.CertificateRequest {
1126
+ return & x509.CertificateRequest {
1127
+ URIs : []* url.URL {agentURL },
1128
+ }
1129
+ },
1130
+ },
1131
+ {
1132
+ name : "err_meshgw_write_not_allowed" ,
1133
+ expectErr : "Permission denied" ,
1134
+ getCSR : func () * x509.CertificateRequest {
1135
+ return & x509.CertificateRequest {
1136
+ URIs : []* url.URL {meshURL },
1137
+ }
1138
+ },
1139
+ },
1140
+ {
1141
+ name : "err_meshgw_different_dc" ,
1142
+ expectErr : "SPIFFE ID in CSR from a different datacenter" ,
1143
+ authAllow : true ,
1144
+ getCSR : func () * x509.CertificateRequest {
1145
+ return & x509.CertificateRequest {
1146
+ URIs : []* url.URL {meshURL },
1147
+ }
1148
+ },
1149
+ },
1150
+ {
1151
+ name : "err_invalid_spiffe_type" ,
1152
+ expectErr : "SPIFFE ID in CSR must be a service, mesh-gateway, or agent ID" ,
1153
+ getCSR : func () * x509.CertificateRequest {
1154
+ u := connect.SpiffeIDSigning {
1155
+ ClusterID : "test-cluster-id" ,
1156
+ Domain : "test-domain" ,
1157
+ }.URI ()
1158
+ return & x509.CertificateRequest {
1159
+ URIs : []* url.URL {u },
1160
+ }
1161
+ },
1162
+ },
1163
+ }
1164
+
1165
+ for _ , tc := range tests {
1166
+ t .Run (tc .name , func (t * testing.T ) {
1167
+ authz := acl .DenyAll ()
1168
+ if tc .authAllow {
1169
+ authz = acl .AllowAll ()
1170
+ }
1171
+
1172
+ cert , err := manager .AuthorizeAndSignCertificate (tc .getCSR (), authz )
1173
+ if tc .expectErr != "" {
1174
+ require .Error (t , err )
1175
+ require .Contains (t , err .Error (), tc .expectErr )
1176
+ } else {
1177
+ require .NoError (t , err )
1178
+ require .NotNil (t , cert )
1179
+ }
1180
+ })
1181
+ }
1182
+ }
0 commit comments