Golang如何从x509证书中获取cn属性

Golang如何从x509证书中获取cn属性 我使用了 pkcs7 包中的 pkcs7.GetOnlySigner() 函数,从一个已签名的调用进程中提取 x509 证书。我只对证书中的 CN(通用名称)属性感兴趣。我该如何实现这一点?返回的证书看起来像这样:

&{[48 130 5 244 48 130 3 220 160 3 2 1 2 2 19 51 0 0 3 78 181 60 122 193 132 111 235 43 0 0 0 0 3 78 48 13 6 9 42 134 72 134 247 13 1 1 11 5 0 48 126 49 11 48 9 6 3 85 4 6 19 2 85 83 49 19 48 17 6 3 85 4 8 19 10 87 97 115 104 105 110 103 116 111 110 49 16 48 14 6 3 85 4 7 19 7 82 101 100 109 111 110 100 49 30 48 28 6 3 85 4 10 19 21 77 105 99 114 111 115 111 102 116 32 67 111 114 112 111 114 97 116 105 111 110 49 40 48 38 6 3 85 4 3 19 31 77 105 99 114 111 115 111 102 116 32 67 111 100 101 32 83 105 103 110 105 110 103 32 80 67 65 32 50 48 49 49 48 30 23 13 50 51 48 51 49 54 49 56 52 51 50 57 90 23 13 50 52 48 51 49 52 49 56 52 51 50 57 90 48 116 49 11 48 9 6 3 85 4 6 19 2 85 83 49 19 48 17 6 3 85 4 8 19 10 87 97 115 104 105 110 103 116 111 110 49 16 48 14 6 3 85 4 7 19 7 82 101 100 109 111 110 100 49 30 48 28 6 3 85 4 10 19 21 77 105 99 114 111 115 111 102 116 32 67 111 114 112 111 114 97 116 105 111 110 49 30 48 28 6 3 85 4 3 19 21 77 105 99 114 111 115 111 102 116 32 67 111 114 112 111 114 97 116 105 111 110 48 130 1 34 48 13 6 9 42 134 72 134 247 13 1 1 1 5 0 3 130 1 15 0 48 130 1 10 2 130 1 1 0 221 8 168 141 35 162 1 21 107 175 37 73 159 233 103 78 38 166 102 35 6 44 228 110 192 36 62 84 109 194 250 182 192 190 16 19 195 110 189 250 164 81 168 213 187 20 167 157 231 71 33 88 158 119 40 50 15 5 43 71 124 140 185 112 210 88 30 196 48 235 238 8 156 127 108 206 4 85 170 126 255 231 72 188 51 36 83 79 229 109 55 12 95 245 214 134 117 218 180 133 168 105 102 248 238 58 113 24 211 12 80 105 49 16 153 100 103 93 102 84 65 142 43 219 203 71 136 213 88 19 15 84 239 1 215 193 97 7 188 217 248 102 89 9 24 71 249 86 152 2 190 189 111 245 249 179 187 140 118 177 93 51 66 196 178 1 91 78 197 240 240 99 81 204 5 199 28 159 109 237 166 28 30 33 212 190 20 208 231 218 248 117 255 105 17 16 237 42 152 103 62 125 177 115 54 201 35 159 189 140 136 142 122 146 59 205 13 24 22 179 228 59 243 32 111 60 39 79 129 54 19 174 218 57 122 13 247 42 141 132 44 212 127 207 49 36 8 43 161 59 149 112 215 74 149 243 2 3 1 0 1 163 130 1 115 48 130 1 111 48 31 6 3 85 29 37 4 24 48 22 6 10 43 6 1 4 1 130 55 76 8 1 6 8 43 6 1 5 5 7 3 3 48 29 6 3 85 29 14 4 22 4 20 156 199 59 102 127 238 144 160 108 6 37 164 193 211 95 176 222 105 119 0 48 69 6 3 85 29 17 4 62 48 60 164 58 48 56 49 30 48 28 6 3 85 4 11 19 21 77 105 99 114 111 115 111 102 116 32 67 111 114 112 111 114 97 116 105 111 110 49 22 48 20 6 3 85 4 5 19 13 50 51 48 48 49 50 43 53 48 48 53 49 54 48 31 6 3 85 29 35 4 24 48 22 128 20 72 110 100 229 80 5 211 130 170 23 55 55 34 181 109 168 202 117 2 149 48 84 6 3 85 29 31 4 77 48 75 48 73 160 71 160 69 134 67 104 116 116 112 58 47 47 119 119 119 46 109 105 99 114 111 115 111 102 116 46 99 111 109 47 112 107 105 111 112 115 47 99 114 108 47 77 105 99 67 111 100 83 105 103 80 67 65 50 48 49 49 95 50 48 49 49 45 48 55 45 48 56 46 99 114 108 48 97 6 8 43 6 1 5 5 7 1 1 4 85 48 83 48 81 6 8 43 6 1 5 5 7 48 2 134 69 104 116 116 112 58 47 47 119 119 119 46 109 105 99 114 111 115 111 102 116 46 99 111 109 47 112 107 105 111 112 115 47 99 101 114 116 115 47 77 105 99 67 111 100 83 105 103 80 67 65 50 48 49 49 95 50 48 49 49 45 48 55 45 48 56 46 99 114 116 48 12 6 3 85 29 19 1 1 255 4 2 48 0 48 13 6 9 42 134 72 134 247 13 1 1 11 5 0 3 130 2 1 0 61 181 191 218 71 160 183 65 72 217 69 2 57 164 155 30 23 196 230 64 62 197 113 197 118 195 201 11 245 250 65 131 123 213 233 128 25 211 214 85 231 199 178 67 164 83 10 7 0 50 35 7 72 158 107 225 43 218 70 5 173 245 79 39 139 222 158 209 218 205 11 241 32 1 60 244 73 28 1 36 224 209 233 5 124 71 142 110 19 42 55 179 1 180 170 169 184 44 203 93 24 236 160 41 203 239 84 172 166 182 144 105 172 184 4 172 147 222 79 86 110 111 122 110 206 153 59 56 218 249 180 4 149 20 248 147 208 46 15 24 254 199 99 221 59 82 124 182 24 100 6 137 193 48 8 130 46 221 135 57 249 133 171 75 163 176 225 207 238 19 248 202 197 119 238 139 81 173 148 223 58 253 237 12 51 14 216 113 249 19 253 253 22 103 186 190 34 159 52 144 176 110 67 9 82 12 164 13 101 216 213 132 3 114 128 113 173 45 35 105 122 133 3 88 177 162 139 214 71 159 117 241 194 172 252 68 175 47 40 156 152 242 24 107 253 96 170 11 191 160 14 59 179 161 36 73 155 66 92 255 198 75 24 27 99 127 37 35 137 249 10 152 164 100 196 185 129 88 85 102 162 159 177 222 234 56 27 227 82 91 164 225 138 13 209 63 111 229 118 171 248 23 82 1 94 218 7 112 78 144 131 178 248 124 72 196 104 171 95 193 53 119 43 238 36 192 83 127 21 130 191 55 137 91 79 98 97 97 100 229 76 209 66 233 254 66 147 86 136 171 34 147 246 40 44 83 224 231 164 57 203 109 242 10 216 158 18 117 233 3 35 152 203 249 163 157 225 140 209 87 59 24 160 145 5 152 205 67 190 235 14 116 131 65 64 120 86 188 230 232 2 8 30 165 92 73 54 212 81 65 212 87 72 30 152 210 65 255 139 63 245 182 57 95 199 126 16 183 185 51 224 41 180 109 94 143 55 77 150 4 185 218 40 201 159 192 86 237 60 178 38 217 220 201 6 56 147 145 44 68 77 192 169 182 27 186 42 116 235 248 66 63 25 208 154 198 128 204 227 227 163 69 40 12 100 45 42 68 230 129 208 96 253 71 180 252 117 148 247 195 238 35 82 108 155 15 232 184 148 29 113 245] [48 130 3 220 160 3 2 1 2 2 19 51 0 0 3 78 181 60 122 193 132 111 235 43 0 0 0 0 3 78 48 13 6 9 42 134 72 134 247 13 1 1 11 5 0 48 126 49 11 48 9 6 3 85 4 6 19 2 85 83 49 19 48 17 6 3 85 4 8 19 10 87 97 115 104 105 110 103 116 111 110 49 16 48 14 6 3 85 4 7 19 7 82 101 100 109 111 110 100 49 30 48 28 6 3 85 4 10 19 21 77 105 99 114 111 115 111 102 116 32 67 111 114 112 111 114 97 116 105 111 110 49 40 48 38 6 3 85 4 3 19 31 77 105 99 114 111 115 111 102 116 32 67 111 100 101 32 83 105 103 110 105 110 103 32 80 67 65 32 50 48 49 49 48 30 23 13 50 51 48 51 49 54 49 56 52 51 50 57 90 23 13 50 52 48 51 49 52 49 56 52 51 50 57 90 48 116 49 11 48 9 6 3 85 4 6 19 2 85 83 49 19 48 17 6 3 85 4 8 19 10 87 97 115 104 105 110 103 116 111 110 49 16 48 14 6 3 85 4 7 19 7 82 101 100 109 111 110 100 49 30 48 28 6 3 85 4 10 19 21 77 105 99 114 111 115 111 102 116 32 67 111 114 112 111 114 97 116 105 111 110 49 30 48 28 6 3 85 4 3 19 21 77 105 99 114 111 115 111 102 116 32 67 111 114 112 111 114 97 116 105 111 110 48 130 1 34 48 13 6 9 42 134 72 134 247 13 1 1 1 5 0 3 130 1 15 0 48 130 1 10 2 130 1 1 0 221 8 168 141 35 162 1 21 107 175 37 73 159 233 103 78 38 166 102 35 6 44 228 110 192 36 62 84 109 194 250 182 192 190 16 19 195 110 189 250 164 81 168 213 187 20 167 157 231 71 33 88 158 119 40 50 15 5 43 71 124 140 185 112 210 88 30 196 48 235 238 8 156 127 108 206 4 85 170 126 255 231 72 188 51 36 83 79 229 109 55 12 95 245 214 134 117 218 180 133 168 105 102 248 238 58 113 24 211 12 80 105 49 16 153 100 103 93 102 84 65 142 43 219 203 71 136 213 88 19 15 84 239

更多关于Golang如何从x509证书中获取cn属性的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

我不熟悉 x509,但查看那个包,我猜你想要 pkcs7.GetOnlySigner().Subject.CommonName

pkcs7.GetOnlySigner().Subject.CommonName

更多关于Golang如何从x509证书中获取cn属性的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


要从x509证书中获取CN属性,可以使用x509.Certificate结构体的Subject字段。以下是具体实现方法:

package main

import (
    "crypto/x509"
    "encoding/pem"
    "fmt"
    "log"
)

func main() {
    // 假设你已经通过pkcs7.GetOnlySigner()获取了证书
    // cert := pkcs7.GetOnlySigner()
    
    // 这里演示从PEM格式证书中解析CN
    pemCert := `-----BEGIN CERTIFICATE-----
MIIF...(你的证书数据)
-----END CERTIFICATE-----`
    
    block, _ := pem.Decode([]byte(pemCert))
    if block == nil {
        log.Fatal("failed to parse PEM block")
    }
    
    cert, err := x509.ParseCertificate(block.Bytes)
    if err != nil {
        log.Fatal(err)
    }
    
    // 获取CN属性
    cn := cert.Subject.CommonName
    fmt.Printf("CN: %s\n", cn)
    
    // 如果需要获取Subject中的所有属性
    fmt.Printf("完整Subject: %+v\n", cert.Subject)
}

如果你的证书已经是*x509.Certificate类型,直接访问Subject.CommonName字段即可:

// 假设cert是从pkcs7.GetOnlySigner()返回的*x509.Certificate
func getCNFromCertificate(cert *x509.Certificate) string {
    return cert.Subject.CommonName
}

// 使用示例
cn := getCNFromCertificate(cert)
fmt.Println("CN:", cn)

如果需要遍历Subject中的所有名称属性:

func printSubjectDetails(cert *x509.Certificate) {
    fmt.Println("CommonName:", cert.Subject.CommonName)
    fmt.Println("Country:", cert.Subject.Country)
    fmt.Println("Organization:", cert.Subject.Organization)
    fmt.Println("OrganizationalUnit:", cert.Subject.OrganizationalUnit)
    fmt.Println("Locality:", cert.Subject.Locality)
    fmt.Println("Province:", cert.Subject.Province)
    fmt.Println("StreetAddress:", cert.Subject.StreetAddress)
    fmt.Println("PostalCode:", cert.Subject.PostalCode)
    fmt.Println("SerialNumber:", cert.Subject.SerialNumber)
}

对于你的具体场景,使用pkcs7.GetOnlySigner()后:

import (
    "crypto/x509"
    "fmt"
    "github.com/fullsailor/pkcs7"
)

func extractCNFromSignedData(signedData []byte) (string, error) {
    p7, err := pkcs7.Parse(signedData)
    if err != nil {
        return "", err
    }
    
    cert := p7.GetOnlySigner()
    if cert == nil {
        return "", fmt.Errorf("no signer certificate found")
    }
    
    return cert.Subject.CommonName, nil
}

x509.CertificateSubject字段是一个pkix.Name结构体,其中CommonName字段就是CN属性的值。如果证书没有设置CN,该字段将为空字符串。

回到顶部