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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions