Skip to content

Displays SSL Certificate Info. Every property is either a string or a int. No objects, for easy storing. #24

Description

@AlexZ33
package main

import (
  "fmt"
  "os"
  "net"
  "bytes"
  "strings"
  "encoding/pem"
  "crypto/tls"
  "crypto/x509"
)

func main() {
  conn, err := tls.Dial("tcp", os.Args[1] + ":443", &tls.Config{
      InsecureSkipVerify: true,
  })
  if err != nil {
      fmt.Println(err)
      return
  }

  var encodedCert bytes.Buffer
  err = pem.Encode(&encodedCert, &pem.Block{
    Type: "CERTIFICATE",
    Bytes: conn.ConnectionState().PeerCertificates[0].Raw,
  })
  if err != nil {
    fmt.Println(err)
    return
  }

  p, err := x509.MarshalPKIXPublicKey(conn.ConnectionState().PeerCertificates[0].PublicKey)
  if err != nil {
    fmt.Println(err)
    return
  }
  publicKey := string(pem.EncodeToMemory(&pem.Block{
    Type:  "PUBLIC KEY",
    Bytes: p,
  }))

  fmt.Print("Issuer: ")
  fmt.Print(conn.ConnectionState().PeerCertificates[0].Issuer.String())
  fmt.Print("\nSubject: ")
  fmt.Print(conn.ConnectionState().PeerCertificates[0].Subject.String())
  fmt.Print("\nSerial Number: ")
  fmt.Print(conn.ConnectionState().PeerCertificates[0].SerialNumber)
  fmt.Print("\nSignature Algorithm: ")
  fmt.Print(conn.ConnectionState().PeerCertificates[0].SignatureAlgorithm.String())
  fmt.Print("\nVersion: ")
  fmt.Print(conn.ConnectionState().PeerCertificates[0].Version)
  fmt.Print("\nNot Before: ")
  fmt.Print(conn.ConnectionState().PeerCertificates[0].NotBefore)
  fmt.Print("\nNot After: ")
  fmt.Print(conn.ConnectionState().PeerCertificates[0].NotAfter)
  fmt.Print("\nEmail Addresses: ")
  fmt.Print(strings.Join(conn.ConnectionState().PeerCertificates[0].EmailAddresses, ", "))
  fmt.Print("\nIP Addresses: ")
  fmt.Print(IPSliceToString(conn.ConnectionState().PeerCertificates[0].IPAddresses, ", "))
  fmt.Print("\nPermitted DNS Domains: ")
  fmt.Print(strings.Join(conn.ConnectionState().PeerCertificates[0].PermittedDNSDomains, ", "))
  fmt.Print("\nExcluded DNS Domains: ")
  fmt.Print(strings.Join(conn.ConnectionState().PeerCertificates[0].ExcludedDNSDomains, ", "))
  fmt.Print("\nPermitted IP Ranges: ")
  fmt.Print(IPRangeSliceToString(conn.ConnectionState().PeerCertificates[0].PermittedIPRanges, ", "))
  fmt.Print("\nEXcluded IP Ranges: ")
  fmt.Print(IPRangeSliceToString(conn.ConnectionState().PeerCertificates[0].ExcludedIPRanges, ", "))
  fmt.Print("\nPermitted Email Addresses: ")
  fmt.Print(strings.Join(conn.ConnectionState().PeerCertificates[0].PermittedEmailAddresses, ", "))
  fmt.Print("\nExcluded Email Addresses: ")
  fmt.Print(strings.Join(conn.ConnectionState().PeerCertificates[0].ExcludedEmailAddresses, ", "))
  fmt.Print("\nPermitted URI Domains: ")
  fmt.Print(strings.Join(conn.ConnectionState().PeerCertificates[0].PermittedURIDomains, ", "))
  fmt.Print("\nExlucded URI Domains: ")
  fmt.Print(strings.Join(conn.ConnectionState().PeerCertificates[0].ExcludedURIDomains, ", "))
  fmt.Print("\nOCSP Server: ")
  fmt.Print(strings.Join(conn.ConnectionState().PeerCertificates[0].OCSPServer, ", "))
  fmt.Print("\nIssuing Certificate URL Server: ")
  fmt.Print(strings.Join(conn.ConnectionState().PeerCertificates[0].IssuingCertificateURL, ", "))
  fmt.Print("\nDNS Names: ")
  fmt.Println(strings.Join(conn.ConnectionState().PeerCertificates[0].DNSNames, ", "))
  fmt.Print("\nPublic Key Algorithm: ")
  fmt.Print(conn.ConnectionState().PeerCertificates[0].PublicKeyAlgorithm.String())
  fmt.Println("\nPublic Key: ")
  fmt.Println(publicKey)
  fmt.Println("Cert: ")
  fmt.Println(encodedCert.String())
}

func IPSliceToString(slice []net.IP, delimiter string) string {
  var s strings.Builder
  for i, e := range slice {
    s.WriteString(e.String())
    if i != len(slice) - 1 {
      s.WriteString(delimiter)
    }
  }
  return s.String()
}

func IPRangeSliceToString(slice []*net.IPNet, delimiter string) string {
  var s strings.Builder
  for i, e := range slice {
    s.WriteString(e.String())
    if i != len(slice) - 1 {
      s.WriteString(delimiter)
    }
  }
  return s.String()
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions