РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1303 of 1593 menu
◀ ▶

Пакет crypto/x509

Пакет crypto/x509 реализует функциональность для работы с сертификатами X.509, закрытыми и открытыми ключами в различных форматах. Он позволяет разбирать сертификаты, создавать новые, проверять подписи, а также маршалировать и демаршалировать ключи. В пакете содержатся функции для работы с PEM-кодированием, парсинга PKCS#1 и PKIX структур, а также функции для создания и валидации сертификатов.

Парсинг сертификата X.509

Функция x509.ParseCertificate принимает DER-кодированные данные сертификата и возвращает структуру x509.Certificate, содержащую всю информацию о сертификате: субъект, издатель, срок действия, публичный ключ и другие поля.

package main import ( "crypto/x509" "encoding/pem" "fmt" "log" ) func main() { certPEM := []byte(`-----BEGIN CERTIFICATE----- MIIDXTCCAkWgAwIBAgIJAKR9X9y...`) block, _ := pem.Decode(certPEM) if block == nil { log.Fatal("failed to decode PEM block") } cert, err := x509.ParseCertificate(block.Bytes) if err != nil { log.Fatal(err) } fmt.Printf("Subject: %s\n", cert.Subject.CommonName) fmt.Printf("Issuer: %s\n", cert.Issuer.CommonName) }

Результат выполнения кода:

"Subject: example.com" "Issuer: CA Example"

Создание сертификата

Функция x509.CreateCertificate создает новый сертификат X.509. Она принимает случайный источник, шаблон сертификата, сертификат издателя, открытый ключ и закрытый ключ издателя. В результате возвращается DER-кодированный сертификат.

package main import ( "crypto/rand" "crypto/rsa" "crypto/x509" "crypto/x509/pkix" "fmt" "math/big" "time" ) func main() { priv, _ := rsa.GenerateKey(rand.Reader, 2048) template := &x509.Certificate{ SerialNumber: big.NewInt(1), Subject: pkix.Name{ CommonName: "example.com", }, NotBefore: time.Now(), NotAfter: time.Now().Add(time.Hour), } certDER, err := x509.CreateCertificate( rand.Reader, template, template, &priv.PublicKey, priv, ) if err != nil { fmt.Println(err) return } fmt.Printf("Certificate created, length: %d bytes", len(certDER)) }

Результат выполнения кода:

"Certificate created, length: 1154 bytes"

Парсинг закрытого ключа PKCS#1

Функция x509.ParsePKCS1PrivateKey разбирает DER-кодированный закрытый ключ в формате PKCS#1 и возвращает структуру rsa.PrivateKey. Этот формат используется для RSA-ключей.

package main import ( "crypto/x509" "encoding/pem" "fmt" "log" ) func main() { keyPEM := []byte(`-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAu1...`) block, _ := pem.Decode(keyPEM) if block == nil { log.Fatal("failed to decode PEM block") } priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) if err != nil { log.Fatal(err) } fmt.Printf("Key size: %d bits", priv.N.BitLen()) }

Результат выполнения кода:

"Key size: 2048 bits"

Маршалинг открытого ключа в PKIX

Функция x509.MarshalPKIXPublicKey сериализует открытый ключ в DER-формат PKIX. Она принимает интерфейс crypto.PublicKey и возвращает байтовый слайс, который можно использовать для хранения или передачи ключа.

package main import ( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/pem" "fmt" ) func main() { priv, _ := rsa.GenerateKey(rand.Reader, 2048) pubDER, err := x509.MarshalPKIXPublicKey(&priv.PublicKey) if err != nil { fmt.Println(err) return } pubPEM := pem.EncodeToMemory(&pem.Block{ Type: "PUBLIC KEY", Bytes: pubDER, }) fmt.Println(string(pubPEM)) }

Результат выполнения кода:

"-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu1..." "-----END PUBLIC KEY-----"

Смотрите также

  • функцию x509.CreateCertificate,
    которая создает новый X.509 сертификат
  • функцию x509.ParseCertificate,
    которая разбирает DER-кодированный сертификат
  • функцию x509.ParsePKCS1PrivateKey,
    которая разбирает RSA-ключ в формате PKCS#1
  • пакет encoding/pem,
    который предоставляет функции для работы с PEM-кодированием
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить