@@ -45,13 +45,15 @@ var _ server.ServiceEndpoints = (*certmanager)(nil)
45
45
// GLOBALS
46
46
47
47
const (
48
- jsonIndent = 2
48
+ jsonIndent = 2
49
+ mimetypePem = "application/x-pem-file"
49
50
)
50
51
51
52
var (
52
53
reRoot = regexp .MustCompile (`^/?$` )
53
54
reCA = regexp .MustCompile (`^/ca/?$` )
54
55
reSerial = regexp .MustCompile (`^/([0-9]+)/?$` )
56
+ rePem = regexp .MustCompile (`^/([0-9]+)/(cert\.pem|key\.pem)?$` )
55
57
)
56
58
57
59
///////////////////////////////////////////////////////////////////////////////
@@ -86,6 +88,13 @@ func (service *certmanager) AddEndpoints(ctx context.Context, r server.Router) {
86
88
// Description: Read a certificate by serial number
87
89
r .AddHandlerFuncRe (ctx , reSerial , service .reqGetCert , http .MethodGet ).(router.Route ).
88
90
SetScope (service .ScopeRead ()... )
91
+
92
+ // Path: /<serial>/key or /<serial>/cert
93
+ // Methods: GET
94
+ // Scopes: read
95
+ // Description: Read a PEM file for a certificate or key by serial number
96
+ r .AddHandlerFuncRe (ctx , rePem , service .reqGetCertPEM , http .MethodGet ).(router.Route ).
97
+ SetScope (service .ScopeRead ()... )
89
98
}
90
99
91
100
///////////////////////////////////////////////////////////////////////////////
@@ -145,6 +154,40 @@ func (service *certmanager) reqGetCert(w http.ResponseWriter, r *http.Request) {
145
154
httpresponse .JSON (w , respCert , http .StatusOK , jsonIndent )
146
155
}
147
156
157
+ // Get a certificate or CA
158
+ func (service * certmanager ) reqGetCertPEM (w http.ResponseWriter , r * http.Request ) {
159
+ urlParameters := router .Params (r .Context ())
160
+
161
+ // Get the certificate
162
+ cert , err := service .Read (urlParameters [0 ])
163
+ if errors .Is (err , ErrNotFound ) {
164
+ httpresponse .Error (w , http .StatusNotFound , err .Error ())
165
+ return
166
+ } else if err != nil {
167
+ httpresponse .Error (w , http .StatusInternalServerError , err .Error ())
168
+ return
169
+ }
170
+
171
+ // Key or Cert
172
+ w .Header ().Set ("Content-Type" , mimetypePem )
173
+ switch urlParameters [1 ] {
174
+ case "cert" :
175
+ if err := cert .WriteCertificate (w ); err != nil {
176
+ httpresponse .Error (w , http .StatusInternalServerError , err .Error ())
177
+ return
178
+ }
179
+ case "key" :
180
+ if cert .IsCA () {
181
+ httpresponse .Error (w , http .StatusForbidden , "Cannot return private key for CA" )
182
+ return
183
+ }
184
+ if err := cert .WritePrivateKey (w ); err != nil {
185
+ httpresponse .Error (w , http .StatusInternalServerError , err .Error ())
186
+ return
187
+ }
188
+ }
189
+ }
190
+
148
191
// Create a new certificate authority
149
192
func (service * certmanager ) reqCreateCA (w http.ResponseWriter , r * http.Request ) {
150
193
var req reqCreateCA
0 commit comments