@@ -2,7 +2,9 @@ package main
2
2
3
3
import (
4
4
"context"
5
+ "crypto/rsa"
5
6
"crypto/x509"
7
+ "encoding/base64"
6
8
"encoding/pem"
7
9
"fmt"
8
10
"log"
@@ -21,7 +23,7 @@ func main() {
21
23
// Load configuration
22
24
cfg , err := config .LoadConfig (os .Getenv ("REDIS_ENDPOINTS_CONFIG_PATH" ))
23
25
if err != nil {
24
- log .Fatalf ("Failed to load config: %v" , err )
26
+ log .Printf ("Failed to load config: %v" , err )
25
27
}
26
28
27
29
// Create a confidential identity credentials provider with certificate authentication
@@ -36,11 +38,11 @@ func main() {
36
38
},
37
39
Scopes : cfg .GetRedisScopes (),
38
40
ClientCert : parseCertificates (cfg .AzureCert ),
39
- ClientPrivateKey : [] byte (cfg .AzurePrivateKey ),
41
+ ClientPrivateKey : parsePrivateKey (cfg .AzurePrivateKey ),
40
42
},
41
43
})
42
44
if err != nil {
43
- log .Fatalf ("Failed to create credentials provider: %v" , err )
45
+ log .Printf ("Failed to create credentials provider: %v" , err )
44
46
}
45
47
46
48
// Create Redis client with streaming credentials provider
@@ -102,21 +104,71 @@ func main() {
102
104
fmt .Printf ("Retrieved value from cluster: %s\n " , clusterVal )
103
105
}
104
106
107
+ func decodeBase64Pem (pemData string ) string {
108
+ decoded , err := base64 .StdEncoding .DecodeString (pemData )
109
+ if err != nil {
110
+ log .Fatalf ("Failed to decode base64: %v" , err )
111
+ }
112
+ return string (decoded )
113
+ }
114
+
115
+ func parsePrivateKey (base64data string ) * rsa.PrivateKey {
116
+ var privateKey * rsa.PrivateKey
117
+ var err error
118
+ pk , err := x509 .ParsePKCS8PrivateKey ([]byte (base64data ))
119
+ if err != nil {
120
+ log .Printf ("Failed to parse pkcs8 key: %v" , err )
121
+ } else {
122
+ privateKey , _ = pk .(* rsa.PrivateKey )
123
+ return privateKey
124
+ }
125
+ pk , err = x509 .ParsePKCS1PrivateKey ([]byte (base64data ))
126
+ if err != nil {
127
+ log .Printf ("Failed to parse pkcs1 key: %v" , err )
128
+ }
129
+ privateKey , _ = pk .(* rsa.PrivateKey )
130
+ if privateKey == nil {
131
+ decoded := decodeBase64Pem (base64data )
132
+ pk , err = x509 .ParsePKCS8PrivateKey ([]byte (decoded ))
133
+ if err != nil {
134
+ log .Printf ("Failed to parse pkcs8 key: %v" , err )
135
+ }
136
+ privateKey , _ = pk .(* rsa.PrivateKey )
137
+ if privateKey == nil {
138
+ pk , err = x509 .ParsePKCS1PrivateKey ([]byte (decoded ))
139
+ if err != nil {
140
+ log .Printf ("Failed to parse pkcs1 key: %v" , err )
141
+ }
142
+ privateKey , _ = pk .(* rsa.PrivateKey )
143
+ }
144
+ }
145
+ return privateKey
146
+ }
147
+
105
148
func parseCertificates (pemData string ) []* x509.Certificate {
106
149
var certs []* x509.Certificate
150
+ decoded := decodeBase64Pem (pemData )
107
151
for {
108
- block , rest := pem .Decode ([]byte (pemData ))
152
+ block , rest := pem .Decode ([]byte (decoded ))
109
153
if block == nil {
110
154
break
111
155
}
112
156
if block .Type == "CERTIFICATE" {
113
157
cert , err := x509 .ParseCertificate (block .Bytes )
114
158
if err != nil {
115
- log .Fatalf ("Failed to parse certificate: %v" , err )
159
+ log .Printf ("Failed to parse certificate: %v" , err )
116
160
}
117
161
certs = append (certs , cert )
118
162
}
119
- pemData = string (rest )
163
+ decoded = string (rest )
164
+ }
165
+ if len (certs ) == 0 {
166
+ decoded := decodeBase64Pem (pemData )
167
+ cert , err := x509 .ParseCertificate ([]byte (decoded ))
168
+ if err != nil {
169
+ log .Printf ("Failed to parse certificate: %v" , err )
170
+ }
171
+ certs = append (certs , cert )
120
172
}
121
173
return certs
122
174
}
0 commit comments