Automatic client and server certificate distribution and maintenance
Branch: master
Clone or download


CircleCI GoDoc Go Report Card


Certify allows easy automatic certificate distribution and maintenance. Certificates are requested as TLS connections are made, courtesy of the GetCertificate and GetClientCertificate tls.Config hooks. Certificates are optionally cached. Simultaneous requests are deduplicated to minimize pressure on issuers.


Certify exposes an Issuer interface which is used to allow switching between issuer backends.

Currently implemented issuers:


Create an issuer:

issuer := &vault.Issuer{
    URL: &url.URL{
        Scheme: "https",
        Host: "",
    Token:     "myVaultToken",
    Role:      "myVaultRole",

Create a Certify:

c := &certify.Certify{
    // Used when request client-side certificates and
    // added to SANs or IPSANs depending on format.
    CommonName: "",
    Issuer: issuer,
    // It is recommended to use a cache.
    Cache: certify.NewMemCache(),
    // It is recommended to set RenewBefore.
    // Refresh cached certificates when < 24H left before expiry.
    RenewBefore: 24*time.Hour,

Use in your TLS Config:

tlsConfig := &tls.Config{
    GetCertificate: c.GetCertificate,

That's it! Both server-side and client-side certificates can be generated:

tlsConfig := &tls.Config{
    GetClientCertificate: c.GetClientCertificate,

For an end-to-end example using gRPC with mutual TLS authentication, see the Vault tests.