1 people like it.

Generate a X509 Certificate for testing purposes

Small script to generate a X509 certificate for testing purposes. In my case, for generating signed PDF documents. This will write the certificate and it's key out into a Pkcs 12 store. It relies on the BouncyCastle library (version 1.7 worked fine).

 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
open System
open Org.BouncyCastle.Asn1.X509
open Org.BouncyCastle.Crypto
open Org.BouncyCastle.Security
open Org.BouncyCastle.Math
open Org.BouncyCastle.Crypto.Prng
open Org.BouncyCastle.Crypto.Generators
open Org.BouncyCastle.Pkcs
open Org.BouncyCastle.X509

let kpg = RsaKeyPairGenerator()
kpg.Init(KeyGenerationParameters(SecureRandom(CryptoApiRandomGenerator()), 1024))
let kp = kpg.GenerateKeyPair()

let gen = X509V3CertificateGenerator()
let certName = X509Name("CN=PickAName")
let serialNo = BigInteger.ProbablePrime(120, new Random())

gen.SetSerialNumber(serialNo)
gen.SetSubjectDN(certName)
gen.SetIssuerDN(certName)
gen.SetNotAfter(DateTime.Now.AddYears(100))
gen.SetNotBefore(DateTime.Now.Subtract(TimeSpan(7, 0, 0, 0)))
gen.SetSignatureAlgorithm("MD5WithRSA")
gen.SetPublicKey(kp.Public)

let cert = gen.Generate(kp.Private)

let store = Pkcs12Store()
let friendlyName = cert.IssuerDN.ToString()
let entry = X509CertificateEntry(cert)
store.SetCertificateEntry(friendlyName, entry)
store.SetKeyEntry(friendlyName, AsymmetricKeyEntry(kp.Private), [| entry |])
store.Save(IO.File.OpenWrite("X509.store"), Seq.toArray "A password here", SecureRandom(CryptoApiRandomGenerator()))
namespace System
val kpg : obj
val kp : obj
val gen : obj
val certName : obj
val serialNo : obj
Multiple items
type Random =
  new : unit -> unit + 1 overload
  member GetSampleForLargeRange : unit -> float
  member InternalSample : unit -> int
  member Next : unit -> int + 2 overloads
  member NextBytes : buffer: byte [] -> unit + 1 overload
  member NextDouble : unit -> float
  member Sample : unit -> float
  static member GenerateGlobalSeed : unit -> int
  static member GenerateSeed : unit -> int
  static val s_globalRandom : Random
  ...

--------------------
Random() : Random
Random(Seed: int) : Random
Multiple items
[<Struct>]
type DateTime =
  new : ticks: int64 -> unit + 13 overloads
  member Add : value: TimeSpan -> DateTime + 1 overload
  member AddDays : value: float -> DateTime
  member AddHours : value: float -> DateTime
  member AddMilliseconds : value: float -> DateTime
  member AddMinutes : value: float -> DateTime
  member AddMonths : months: int -> DateTime
  member AddSeconds : value: float -> DateTime
  member AddTicks : value: int64 -> DateTime
  member AddYears : value: int -> DateTime
  ...

--------------------
DateTime ()
   (+0 other overloads)
DateTime(ticks: int64) : DateTime
   (+0 other overloads)
DateTime(ticks: int64, kind: DateTimeKind) : DateTime
   (+0 other overloads)
DateTime(year: int, month: int, day: int) : DateTime
   (+0 other overloads)
DateTime(year: int, month: int, day: int, calendar: Globalization.Calendar) : DateTime
   (+0 other overloads)
DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int) : DateTime
   (+0 other overloads)
DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, kind: DateTimeKind) : DateTime
   (+0 other overloads)
DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, calendar: Globalization.Calendar) : DateTime
   (+0 other overloads)
DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, millisecond: int) : DateTime
   (+0 other overloads)
DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, millisecond: int, kind: DateTimeKind) : DateTime
   (+0 other overloads)
property DateTime.Now: DateTime with get
DateTime.AddYears(value: int) : DateTime
DateTime.Subtract(value: TimeSpan) : DateTime
DateTime.Subtract(value: DateTime) : TimeSpan
Multiple items
[<Struct>]
type TimeSpan =
  new : ticks: int64 -> unit + 3 overloads
  member Add : ts: TimeSpan -> TimeSpan
  member CompareTo : value: obj -> int + 1 overload
  member Divide : divisor: float -> TimeSpan + 1 overload
  member Duration : unit -> TimeSpan
  member Equals : value: obj -> bool + 2 overloads
  member GetHashCode : unit -> int
  member Multiply : factor: float -> TimeSpan
  member Negate : unit -> TimeSpan
  member Subtract : ts: TimeSpan -> TimeSpan
  ...

--------------------
TimeSpan ()
TimeSpan(ticks: int64) : TimeSpan
TimeSpan(hours: int, minutes: int, seconds: int) : TimeSpan
TimeSpan(days: int, hours: int, minutes: int, seconds: int) : TimeSpan
TimeSpan(days: int, hours: int, minutes: int, seconds: int, milliseconds: int) : TimeSpan
val cert : obj
val store : obj
val friendlyName : obj
val entry : obj
namespace System.IO
type File =
  static member AppendAllLines : path: string * contents: IEnumerable<string> -> unit + 1 overload
  static member AppendAllLinesAsync : path: string * contents: IEnumerable<string> *?cancellationToken: CancellationToken -> Task + 1 overload
  static member AppendAllText : path: string * contents: string -> unit + 1 overload
  static member AppendAllTextAsync : path: string * contents: string *?cancellationToken: CancellationToken -> Task + 1 overload
  static member AppendText : path: string -> StreamWriter
  static member AsyncStreamReader : path: string * encoding: Encoding -> StreamReader
  static member AsyncStreamWriter : path: string * encoding: Encoding * append: bool -> StreamWriter
  static member Copy : sourceFileName: string * destFileName: string -> unit + 1 overload
  static member Create : path: string -> FileStream + 2 overloads
  static member CreateText : path: string -> StreamWriter
  ...
IO.File.OpenWrite(path: string) : IO.FileStream
module Seq

from Microsoft.FSharp.Collections
val toArray : source:seq<'T> -> 'T []

More information

Link:http://fssnip.net/kk
Posted:18 days ago
Author:mavnn
Tags: x509 , crypto