diff --git a/server/store/store.go b/server/store/store.go
index cf6922513d6d48ac89483a0006c93b8a9653d7f9..f14e79ff54d8e660986b90738babecf85a00448c 100644
--- a/server/store/store.go
+++ b/server/store/store.go
@@ -1,6 +1,7 @@
 package store
 
 import (
+	"encoding/json"
 	"time"
 
 	"golang.org/x/crypto/ssh"
@@ -43,6 +44,20 @@ type CertRecord struct {
 	Raw        string            `json:"-" db:"raw_key"`
 }
 
+func (c *CertRecord) MarshalJSON() ([]byte, error) {
+	type Alias CertRecord
+	f := "2006-01-02 15:04:05 -0700"
+	return json.Marshal(&struct {
+		*Alias
+		CreatedAt string `json:"created_at"`
+		Expires   string `json:"expires"`
+	}{
+		Alias:     (*Alias)(c),
+		CreatedAt: c.CreatedAt.Format(f),
+		Expires:   c.Expires.Format(f),
+	})
+}
+
 func parseTime(t uint64) time.Time {
 	return time.Unix(int64(t), 0)
 }
diff --git a/server/store/store_test.go b/server/store/store_test.go
index cd58ccd706dc05ebf9757864b6255e8bfae18c6f..71a74c095bd586a52ced1b936c492d37bb05b7b3 100644
--- a/server/store/store_test.go
+++ b/server/store/store_test.go
@@ -4,6 +4,7 @@ import (
 	"crypto/rand"
 	"crypto/rsa"
 	"database/sql"
+	"encoding/json"
 	"io/ioutil"
 	"os"
 	"os/user"
@@ -160,3 +161,20 @@ func TestSQLiteStore(t *testing.T) {
 	}
 	testStore(t, db)
 }
+
+func TestMarshalCert(t *testing.T) {
+	a := assert.New(t)
+	c := &CertRecord{
+		KeyID:      "id",
+		Principals: []string{"user"},
+		CreatedAt:  time.Date(2017, time.April, 10, 13, 0, 0, 0, time.UTC),
+		Expires:    time.Date(2017, time.April, 11, 10, 0, 0, 0, time.UTC),
+		Raw:        "ABCDEF",
+	}
+	b, err := json.Marshal(c)
+	if err != nil {
+		t.Error(err)
+	}
+	want := `{"key_id":"id","principals":["user"],"revoked":false,"created_at":"2017-04-10 13:00:00 +0000","expires":"2017-04-11 10:00:00 +0000"}`
+	a.JSONEq(want, string(b))
+}