Skip to content

Commit e9c13db

Browse files
committed
feat(ssl): Add API interfaces for managing SSL certificates
- Add CertListReq and CertListResp for retrieving SSL certificate lists - Add CertDetailResp and RealCertDetailResp for retrieving SSL certificate details - Implement GetCertList and GetCertDetail methods for fetching SSL certificate lists and details - Add UploadCertReq and UploadCertResp for uploading SSL certificates - Implement UploadCert method for uploading SSL certificates - Implement DeleteCert method for deleting SSL certificates Refs #136
1 parent 6da001b commit e9c13db

File tree

1 file changed

+221
-0
lines changed

1 file changed

+221
-0
lines changed

cdn/api.go

Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,3 +305,224 @@ func postRequest(mac *auth.Credentials, path string, body interface{}) (resData
305305

306306
return
307307
}
308+
309+
// CertListReq 获取ssl证书列表请求内容
310+
type CertListReq struct {
311+
Marker string `json:"marker"`
312+
Limit int `json:"limit"`
313+
}
314+
315+
// CertListResp 获取ssl证书列表响应内容
316+
type CertListResp struct {
317+
Marker string `json:"marker"`
318+
Certs []struct {
319+
CertID string `json:"certid"`
320+
Name string `json:"name"`
321+
CommonName string `json:"common_name"`
322+
DNSNames []string `json:"dnsnames"`
323+
NotBefore int `json:"not_before"`
324+
NotAfter int `json:"not_after"`
325+
CreateTime int `json:"create_time"`
326+
} `json:"certs"`
327+
}
328+
329+
// GetCertList 获取ssl证书列表
330+
func (m *CdnManager) GetCertList(marker string, limit int) (certList CertListResp, err error) {
331+
reqParams := fmt.Sprintf("marker=%s&limit=%d", marker, limit)
332+
urlStr := fmt.Sprintf("%s/sslcert?%s", FusionHost, reqParams)
333+
req, reqErr := http.NewRequest("GET", urlStr, nil)
334+
if reqErr != nil {
335+
err = reqErr
336+
return
337+
}
338+
accessToken, signErr := m.mac.SignRequest(req)
339+
if signErr != nil {
340+
err = signErr
341+
return
342+
}
343+
req.Header.Add("Authorization", "QBox "+accessToken)
344+
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
345+
resp, respErr := http.DefaultClient.Do(req)
346+
if respErr != nil {
347+
err = respErr
348+
return
349+
}
350+
defer resp.Body.Close()
351+
resData, ioErr := ioutil.ReadAll(resp.Body)
352+
if ioErr != nil {
353+
err = ioErr
354+
return
355+
}
356+
umErr := json.Unmarshal(resData, &certList)
357+
if umErr != nil {
358+
err = umErr
359+
return
360+
}
361+
362+
return
363+
}
364+
365+
// CertDetailResp 获取单个ssl证书响应内容
366+
type CertDetailResp struct {
367+
Name string `json:"name"`
368+
CommonName string `json:"common_name"`
369+
DNSNames []string `json:"dnsnames"`
370+
NotBefore int `json:"not_before"`
371+
NotAfter int `json:"not_after"`
372+
Pri string `json:"pri"`
373+
Ca string `json:"ca"`
374+
CreateTime int `json:"create_time"`
375+
}
376+
377+
// RealCertDetailResp 当前的api返回与官方文档有差异
378+
type RealCertDetailResp struct {
379+
CertID string `json:"certid"`
380+
Name string `json:"name"`
381+
UID int `json:"uid"`
382+
CommonName string `json:"common_name"`
383+
DNSNames []string `json:"dnsnames"`
384+
CreateTime int `json:"create_time"`
385+
NotBefore int `json:"not_before"`
386+
NotAfter int `json:"not_after"`
387+
OrderID string `json:"orderid"`
388+
ProductShortName string `json:"product_short_name"`
389+
ProductType string `json:"product_type"`
390+
CertType string `json:"cert_type"`
391+
Encrypt string `json:"encrypt"`
392+
EncryptParameter string `json:"encryptParameter"`
393+
Enable bool `json:"enable"`
394+
ChildOrderID string `json:"child_order_id"`
395+
State string `json:"state"`
396+
AutoRenew bool `json:"auto_renew"`
397+
Renewable bool `json:"renewable"`
398+
CA string `json:"ca"`
399+
}
400+
401+
// GetCertDetail 获取单个ssl证书的详细信息
402+
func (m *CdnManager) GetCertDetail(certID string) (certDetail CertDetailResp, err error) {
403+
urlStr := fmt.Sprintf("%s/sslcert/%s", FusionHost, certID)
404+
req, reqErr := http.NewRequest("GET", urlStr, nil)
405+
if reqErr != nil {
406+
err = reqErr
407+
return
408+
}
409+
accessToken, signErr := m.mac.SignRequest(req)
410+
if signErr != nil {
411+
err = signErr
412+
return
413+
}
414+
req.Header.Add("Authorization", "QBox "+accessToken)
415+
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
416+
resp, respErr := http.DefaultClient.Do(req)
417+
if respErr != nil {
418+
err = respErr
419+
return
420+
}
421+
defer resp.Body.Close()
422+
resData, ioErr := ioutil.ReadAll(resp.Body)
423+
if ioErr != nil {
424+
err = ioErr
425+
return
426+
}
427+
var resJson = struct {
428+
Code int
429+
Error string
430+
Cert RealCertDetailResp
431+
}{}
432+
umErr := json.Unmarshal(resData, &resJson)
433+
certDetail.Ca = resJson.Cert.CA
434+
certDetail.CommonName = resJson.Cert.Name
435+
certDetail.DNSNames = resJson.Cert.DNSNames
436+
certDetail.Name = resJson.Cert.Name
437+
certDetail.NotAfter = resJson.Cert.NotAfter
438+
certDetail.NotBefore = resJson.Cert.NotBefore
439+
certDetail.CreateTime = resJson.Cert.CreateTime
440+
if umErr != nil {
441+
err = umErr
442+
return
443+
}
444+
445+
return
446+
}
447+
448+
// UploadCertReq 上传ssl证书请求内容
449+
type UploadCertReq struct {
450+
Name string `json:"name"`
451+
CommonName string `json:"common_name"`
452+
Pri string `json:"pri"`
453+
Ca string `json:"ca"`
454+
}
455+
456+
// UploadCertResp 上传ssl证书响应内容
457+
type UploadCertResp struct {
458+
CertID string `json:"certID"`
459+
}
460+
461+
// UploadCert 上传ssl证书
462+
func (m *CdnManager) UploadCert(name, commonName, pri, ca string) (resp UploadCertResp, err error) {
463+
reqBody := UploadCertReq{
464+
Name: name,
465+
CommonName: commonName,
466+
Pri: pri,
467+
Ca: ca,
468+
}
469+
urlStr := fmt.Sprintf("%s/sslcert", FusionHost)
470+
reqData, _ := json.Marshal(reqBody)
471+
req, reqErr := http.NewRequest("POST", urlStr, bytes.NewReader(reqData))
472+
if reqErr != nil {
473+
err = reqErr
474+
return
475+
}
476+
accessToken, signErr := m.mac.SignRequest(req)
477+
if signErr != nil {
478+
err = signErr
479+
return
480+
}
481+
req.Header.Add("Authorization", "QBox "+accessToken)
482+
req.Header.Add("Content-Type", "application/json")
483+
httpResp, respErr := http.DefaultClient.Do(req)
484+
if respErr != nil {
485+
err = respErr
486+
return
487+
}
488+
defer httpResp.Body.Close()
489+
resData, ioErr := ioutil.ReadAll(httpResp.Body)
490+
if ioErr != nil {
491+
err = ioErr
492+
return
493+
}
494+
umErr := json.Unmarshal(resData, &resp)
495+
if umErr != nil {
496+
err = umErr
497+
return
498+
}
499+
return
500+
}
501+
502+
// DeleteCert 删除ssl证书
503+
func (m *CdnManager) DeleteCert(certID string) (err error) {
504+
urlStr := fmt.Sprintf("%s/sslcert/%s", FusionHost, certID)
505+
req, reqErr := http.NewRequest("DELETE", urlStr, nil)
506+
if reqErr != nil {
507+
err = reqErr
508+
return
509+
}
510+
accessToken, signErr := m.mac.SignRequest(req)
511+
if signErr != nil {
512+
err = signErr
513+
return
514+
}
515+
req.Header.Add("Authorization", "QBox "+accessToken)
516+
req.Header.Add("Content-Type", "application/json")
517+
resp, respErr := http.DefaultClient.Do(req)
518+
if respErr != nil {
519+
err = respErr
520+
return
521+
}
522+
defer resp.Body.Close()
523+
if resp.StatusCode != http.StatusOK {
524+
err = fmt.Errorf("unexpected status code: %d", resp.StatusCode)
525+
return
526+
}
527+
return
528+
}

0 commit comments

Comments
 (0)