Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
98 commits
Select commit Hold shift + click to select a range
b8163a1
Split sig verification out of parsing, added TACK_Extension.verifySig…
trevp May 8, 2012
bb86702
Fix SSL_Cert.matches()
trevp May 8, 2012
88c2b88
Update for integration with latest TLS Lite.
trevp May 8, 2012
e0e9190
Cleanup unnecessary static func writeTextTACKStructures().
trevp May 8, 2012
3478f77
pin_activation converts input to boolean, more convenient for tlslite.
trevp May 8, 2012
31424ab
Move length check from parsePEM to parse.
trevp May 9, 2012
252959e
Refactored the TACKpy structure.
moxie0 May 10, 2012
e78a99b
Slightly improve some error msgs.
trevp May 10, 2012
9570e79
Cleanup usage and error strings.
trevp May 10, 2012
c596f45
Changed SNI to SHOULD, added note about pin_activation with no TACK.
trevp May 10, 2012
e64d7b9
Consolidated EC logic into explicit key classes.
moxie0 May 10, 2012
67afde8
Fixed "make test" bugs.
trevp May 11, 2012
dad6c0d
Fleshing out setup.py list of packages.
trevp May 11, 2012
57ed4a2
Added Makefile with default, clean, install, test.
trevp May 11, 2012
dae1e6b
Renamed createFromParameters() -> create.
trevp May 11, 2012
f4bfaf7
(merge from TACKpy) Split sig verification out of parsing.
trevp May 11, 2012
c71d7a2
(merge from TACKpy) Fix TlsCertificate.matches().
trevp May 11, 2012
6168174
(merging TACKpy) Fix parsing of TACK_Extension per latest spec.
trevp May 11, 2012
81a0759
(merging TACKpy) pin_activation converts input to boolean, more conve…
trevp May 11, 2012
819d1be
(merging TACKpy) Clean up length-checks on parsing.
trevp May 11, 2012
300207d
Cleanup some usage and error strings.
trevp May 11, 2012
d3d2cca
Trivial changes.
trevp May 11, 2012
95e8c59
Various renamings, KeyFile cleanup, generate key outside Keyfile.create.
trevp May 11, 2012
562ec45
Adding testdata for "make test".
trevp May 12, 2012
e4f382e
Minor cleanups: rename PEM to encode/decode, remove serializePrelude.
trevp May 12, 2012
a95282c
Add back in serializePreSig, make verifySignature() public.
trevp May 12, 2012
4e8e41c
Move length check into getBytes().
trevp May 12, 2012
9e6c7df
Remove TackVersion.
trevp May 12, 2012
ebdfaef
First version of ctypes ECDSA, passes "make test".
trevp May 13, 2012
393592d
Display OpenSSL version.
trevp May 13, 2012
ad51841
Some README and LICENSE edits.
trevp May 13, 2012
3ceddfd
Finish ECDSA / ctypes checkin.
trevp May 13, 2012
c9c09b1
Change it back to do sig verification on parsing - safer.
trevp May 13, 2012
a2378d8
OpenSSL/ctypes AES
trevp May 13, 2012
2d5e79e
Clean help output - remove extra linefeeds, improve "tack help".
trevp May 13, 2012
620a72c
Move OpenSSL into crypto/openssl, add factories, in prep for python c…
trevp May 13, 2012
1b0838f
oops update setup.py for prev checkin.
trevp May 13, 2012
28b209f
Add back ECGenerator.
trevp May 13, 2012
3b512be
Added Python AES.
trevp May 13, 2012
0e9f1a2
Python crypto (AES and ECDSA)
trevp May 13, 2012
97363e5
Reinstate "make dist", but without MANIFEST.
trevp May 13, 2012
00154c1
Remove some imports.
trevp May 13, 2012
82b21c9
Renamed tests to be compatible with default NOSE_TESTMATCH.
May 16, 2012
4a1cd70
Cleanup AES classes.
trevp May 16, 2012
9974b2b
Merge branch 'nextnextgen' of github.com:trevp/TACKpy into nextnextgen
trevp May 16, 2012
f45cb1d
Change "make test" to not prompt for password, too annoying.
trevp May 16, 2012
6ce5c1f
Error strings on loading OpenSSL.
trevp May 16, 2012
bc5da2a
Fix ctypes string passing. Python3 fixes (passes make test).
trevp May 16, 2012
08d19bc
OpenSSL support on Windows (libeay32.dll).
trevp May 16, 2012
2244616
Display crypto version (openssl version or error) on -v.
trevp May 16, 2012
2fa0d20
Oops add -v cryptoversion display to tack break command, too.
trevp May 16, 2012
bd708a9
Support for STDIN args on cmdline ("-").
trevp May 17, 2012
bf470f3
Add "-x" option to force python crypto.
trevp May 17, 2012
86eefbc
Better reporting of missing EC in OpenSSL.
trevp May 17, 2012
df2bbd0
Adapt TlsCertificate to new classes, fixup "tackcert" to handle DER/PEM.
trevp May 17, 2012
c1780b9
Passing unit tests, now.
trevp May 17, 2012
306fdbc
Added license headers to all source files.
trevp May 17, 2012
93191b2
Cosmetic touchups.
trevp May 17, 2012
2fcbdde
Update version to 0.9.7, this is getting close to releasable.
trevp May 20, 2012
6689b6a
README tweaks.
trevp May 21, 2012
6b91618
Rename duration to delta.
trevp May 21, 2012
700a72a
Added PythonCrypto_Test (unit tests).
trevp May 21, 2012
a125081
Rename "tackcert" command to "cert".
trevp May 21, 2012
aabaa1f
Oops complete renaming tackcert -> cert.
trevp May 21, 2012
27c0d68
Use OpenSSL (if available) for unit testing.
trevp May 22, 2012
94695cc
Touchup cosmetic things w/"cert" command.
trevp May 22, 2012
ca4349d
Fixed some typos, removed unnecessary imports, added pedantic scoping.
moxie0 May 22, 2012
f6be239
Merged nextnextgen into master
moxie0 May 22, 2012
0b7fde1
Moved draft into separate repository.
moxie0 May 22, 2012
4bf90a9
oops adding missing file.
trevp May 22, 2012
fea29c3
Touchup README and setup.py for release.
trevp May 22, 2012
58b996a
Rename "TACK ID" to "fingerprint".
trevp Jul 6, 2012
ad96e4d
Rename "fingerprint" to "key fingerprint", "pin_activation" to "activ…
trevp Jul 6, 2012
978a063
Updating tackpy README.
trevp Jul 6, 2012
8c90332
Renaming Readme title to "Pin deactivation".
trevp Jul 6, 2012
2a5b193
Set tack expiration to cert expiration plus 30 days.
trevp Jul 6, 2012
c35353e
Adding pack/unpack commands, bit of cleanup on commands.
trevp Jul 12, 2012
9e0f5ad
Add PEM comments to packed TACK Extensions.
trevp Jul 25, 2012
7b4c603
Supporting tack pairs in an Extension, needs more tests.
trevp Aug 13, 2012
71fbdf6
Add Makefile test for paired tacks.
trevp Aug 14, 2012
ab51b89
Change activation_flags to integer, remove TackActivation.
trevp Aug 21, 2012
0471e7b
Roll back base32 l->8
trevp Aug 30, 2012
05ed996
Update README for rollover.
trevp Sep 5, 2012
769b403
Changing version strings for 0.9.8.
trevp Sep 5, 2012
f58d311
Remove break sigs.
trevp Sep 8, 2012
d131187
Disallow empty TACK_Extensions.
trevp Sep 8, 2012
e6c08a1
EVP_CIPHER_CTX_init definition fixed
kyprizel Sep 21, 2012
de9e642
Tweaks.
trevp Sep 24, 2012
72f89a4
Oops 0.9.9 checkin, but *ALSO* fixed leftover TackBreakSig reference …
trevp Sep 27, 2012
e101d43
Change version to 0.9.9a
trevp Sep 27, 2012
d53fd75
Merge pull request #1 from kyprizel/master
trevp Oct 9, 2012
6668797
Process extension files in "extender" format.
trevp Feb 2, 2013
29b8f96
Merge branch 'master' of github.com:tack/tackpy
trevp Feb 2, 2013
1d1fee1
Change sign to take positional args for KEY and CERT.
trevp Feb 20, 2013
b485b56
Tweak README for new version.
trevp Feb 20, 2013
60e3214
Change pack and unpack to take positional args.
trevp Feb 20, 2013
e290d7a
Oops fix help command.
trevp Feb 20, 2013
cc34364
Fix OpenSSL free bug.
trevp May 10, 2013
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
*.pyc
.idea
5 changes: 3 additions & 2 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@

TACKpy includes code from different sources. All code is dedicated to the
Tackpy includes code from different sources. All code is dedicated to the
public domain by its authors. In particular:

-

Code written by Trevor Perrin is available under the following terms:
Code written by Trevor Perrin and Moxie Marlinspike is available under the
following terms:

This is free and unencumbered software released into the public domain.

Expand Down
7 changes: 0 additions & 7 deletions MANIFEST.in

This file was deleted.

73 changes: 31 additions & 42 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,64 +1,53 @@

TESTDIR = testoutput

.PHONY : default
default:
@echo To install TACKpy run \"./setup.py install\" or \"make install\"

SCDIR := selfcontained

# Variables for testing
TESTDIR = testoutput
EXEC = TACK.py
CERT1 = ./testdata/serverX509Cert.pem
CERT2 = ./testdata/serverX509Cert.der
@echo To install tackpy run \"./setup.py install\" or \"make install\"
@echo

.PHONY: install
install:
./setup.py install

.PHONY: dist
dist:
./setup.py sdist

.PHONY : clean
clean:
rm -f src/*.pyc
rm -rf $(SCDIR)
rm -rf $(TESTDIR)
rm -f `find . -name *.pyc`
rm -rf build
rm -rf dist
rm -rf $(TESTDIR)

.PHONY: selfcontained
selfcontained:
rm -rf $(SCDIR)
mkdir $(SCDIR)
./make_selfcontained.py > $(SCDIR)/TACK.py
chmod +x $(SCDIR)/TACK.py

dist: selfcontained
./setup.py sdist
# Variables for testing
TESTDIR = testoutput
EXEC = ./tack.py
CERT1 = ./testdata/serverX509Cert.pem
CERT2 = ./testdata/serverX509Cert.der

.PHONY: test
test:
rm -rf $(TESTDIR)
mkdir $(TESTDIR)
$(EXEC) test
# NOTE: USE 'asdf' for passwords...
$(EXEC) genkey > $(TESTDIR)/TACK_Key1.pem
$(EXEC) genkey -p asdf > $(TESTDIR)/TACK_Key2.pem
$(EXEC) genkey -p asdf > $(TESTDIR)/TACK_Key1.pem
$(EXEC) genkey -x -p asdf > $(TESTDIR)/TACK_Key2.pem
$(EXEC) genkey -p asdf -o $(TESTDIR)/TACK_Key3.pem
$(EXEC) sign -k $(TESTDIR)/TACK_Key1.pem -c $(CERT1) > $(TESTDIR)/TACK1.pem
$(EXEC) sign -k $(TESTDIR)/TACK_Key1.pem -p asdf -c $(CERT2) -o $(TESTDIR)/TACK2.pem
$(EXEC) sign -k $(TESTDIR)/TACK_Key1.pem -p asdf -c $(CERT1) -m2 -o $(TESTDIR)/TACK3.pem
$(EXEC) sign -k $(TESTDIR)/TACK_Key1.pem -p asdf -c $(CERT1) -o $(TESTDIR)/TACK4.pem
$(EXEC) sign -k $(TESTDIR)/TACK_Key1.pem -p asdf -e 2030-06-06Z -c $(CERT1) -o $(TESTDIR)/TACK5.pem
$(EXEC) sign -k $(TESTDIR)/TACK_Key1.pem -p asdf -g2 -m2 -c $(CERT1) -o $(TESTDIR)/TACK6.pem
$(EXEC) sign -k $(TESTDIR)/TACK_Key1.pem -p asdf -m250 -g251 -c $(CERT1) -o $(TESTDIR)/T6 -e 2013-01-02Z -n 3@1d
$(EXEC) break -k $(TESTDIR)/TACK_Key1.pem -p asdf > $(TESTDIR)/TACK_Break_Sig1.pem
$(EXEC) b -k $(TESTDIR)/TACK_Key2.pem -p asdf -o $(TESTDIR)/TACK_Break_Sig2.pem
cat $(TESTDIR)/TACK_Break_Sig1.pem $(TESTDIR)/TACK_Break_Sig2.pem > $(TESTDIR)/TACK_Break_Sigs.pem
$(EXEC) tackcert -i $(TESTDIR)/TACK3.pem > $(TESTDIR)/TACK_Cert3.pem
$(EXEC) tackcert -i $(TESTDIR)/TACK4.pem -b $(TESTDIR)/TACK_Break_Sigs.pem > $(TESTDIR)/TACK_Cert4.pem
$(EXEC) tackcert -i $(TESTDIR)/TACK_Cert3.pem > $(TESTDIR)/TACK3_FromCert.pem
$(EXEC) sign $(TESTDIR)/TACK_Key1.pem -p asdf $(CERT1) > $(TESTDIR)/TACK1.pem
cat $(TESTDIR)/TACK_Key1.pem | $(EXEC) sign - -p asdf $(CERT2) -o $(TESTDIR)/TACK2.pem
$(EXEC) sign -x $(TESTDIR)/TACK_Key1.pem -p asdf $(CERT1) -m2 -o $(TESTDIR)/TACK3.pem
$(EXEC) sign $(TESTDIR)/TACK_Key1.pem -p asdf $(CERT1) -o $(TESTDIR)/TACK4.pem
$(EXEC) sign -x $(TESTDIR)/TACK_Key1.pem -p asdf -e 2030-06-06Z $(CERT2) -o $(TESTDIR)/TACK5.pem
cat $(CERT1) | $(EXEC) sign $(TESTDIR)/TACK_Key1.pem -p asdf -g2 -m2 - -o $(TESTDIR)/TACK6.pem
cat $(CERT2) | $(EXEC) sign $(TESTDIR)/TACK_Key1.pem -p asdf -m250 -g251 - -o $(TESTDIR)/T6 -e 2013-01-02Z -n 3@1d
$(EXEC) pack $(TESTDIR)/TACK3.pem > $(TESTDIR)/TACK_Ext3.pem
cat $(TESTDIR)/TACK3.pem $(TESTDIR)/TACK4.pem > $(TESTDIR)/TACK3_4.pem
$(EXEC) pack $(TESTDIR)/TACK3_4.pem > $(TESTDIR)/TACK_Ext3_4.pem
$(EXEC) unpack $(TESTDIR)/TACK_Ext3_4.pem -o $(TESTDIR)/TACK_Ext3_4_Unpack.txt
$(EXEC) view $(TESTDIR)/TACK_Key1.pem > $(TESTDIR)/TACK_View_Key1.txt
$(EXEC) view $(TESTDIR)/TACK1.pem > $(TESTDIR)/TACK_View1.txt
$(EXEC) v $(TESTDIR)/TACK_Break_Sigs.pem > $(TESTDIR)/TACK_View_Break_Sigs.txt
cat $(TESTDIR)/TACK1.pem | $(EXEC) view - > $(TESTDIR)/TACK_View1.txt
$(EXEC) v $(CERT1) > $(TESTDIR)/TACK_View_Cert1.txt
$(EXEC) v $(CERT2) > $(TESTDIR)/TACK_View_Cert2.txt
$(EXEC) v $(TESTDIR)/TACK_Cert3.pem > $(TESTDIR)/TACK_View_TACK_Cert3.txt
cat $(CERT2) | $(EXEC) v - > $(TESTDIR)/TACK_View_Cert2.txt
$(EXEC) v $(TESTDIR)/TACK_Ext3.pem > $(TESTDIR)/TACK_View_TACK_Ext3.txt
@echo OK
180 changes: 86 additions & 94 deletions README
Original file line number Diff line number Diff line change
@@ -1,150 +1,142 @@
TACKpy version 0.9.6 Feb 23 2012
Trevor Perrin <tackpy at trevp.net>
Tackpy version 0.9.9b Sep 25 2012
============================================================================

Licenses/Acknowledgements
==========================
TACKpy is written (mostly) by Trevor Perrin. It includes crypto code from
Peter Pearson (ECDSA) and Bram Cohen (AES).
Tackpy is written by Trevor Perrin and Moxie Marlinspike. It includes crypto
code from Peter Pearson (ECDSA) and Bram Cohen (AES).

All code in TACKpy has been dedicated to the public domain by its authors. See
All code in tackpy has been dedicated to the public domain by its authors. See
the LICENSE file for details.


Installation
=============
TACKpy requires Python 2.6 or greater, or Python 3.
Tackpy requires Python 2.6 or greater, or Python 3.

Run "python setup.py install" or "make install". This installs:
- The "TACKpy" library for use by other Python programs (such as TLS Lite).
- The "TACK.py" command for working with TACKs.
Run "make install" or "python setup.py install". This installs:
- The "tack" library for use by other Python programs (such as TLS Lite).
- The "tack" command-line tool.

To use TACK.py without installation you can run "selfcontained/TACK.py".
To use the command-line tool without installation run "./tack.py".

If you have M2Crypto installed, TACKpy will use it for elliptic curve and AES
operations.
OpenSSL
--------
Tackpy tries to use OpenSSL for AES and ECDSA operations. If OpenSSL cannot be
loaded, Tackpy will fall back to using slower python crypto code.

To use OpenSSL on Windows you need "libeay32.dll" on your path. On Red Hat
systems you need to provide your own libcrypto as the system default does not
include elliptic curve support.

TACK.py quick start
====================

Quick start with command-line tool
===================================
You will need to create one or more TACK keys to "pin" your hostnames to. You
should use a different key for each hostname, unless those hostnames are
closely related (such as aliases for the same host, or hosts sharing a TLS
private key). Once you decide how many TACK keys you need, and the assignment
of hostnames to keys, do the following:

Create a TACK key:
1) Run "TACK.py genkey > KEY.pem" (replace "KEY" with a specific name)
1) Run "tack genkey > KEY.pem" (replace "KEY" with a specific name)
2) Back up the key file where it won't be lost or stolen.

If a hostname is using TACK, each server at that hostname must have a TACK
If a hostname is using TACK, each server at that hostname must have a tack
that signs the public key in the server's certificate. To create and deploy
these TACKs, do the following:

Create a TACK for a certificate's public key:
1) Run "TACK.py sign -k KEY.pem -c CERT > TACK.pem".

Deploy TACKs to a hostname
1) Deploy TACKs to each server at the hostname.
- Apache: Set "SSLTackFile" to a TACK file.
2) Once all servers are serving a TACK, activate pinning on each server.
- Apache: Set "SSLTackPinActivation On".
3) Test the site (if there are problems, see "Removing TACKs").
4) Whenever you change a server's certificate, you must replace its TACK.


Removing TACKs
===============

Disabling pin activation
-------------------------
If you wish to stop using TACK for a hostname but can tolerate a "waiting
period" before the TACKs are removed, simply disable pin activation at all
servers for that hostname (Apache: "SSLTackPinActivation Off"). Then wait
for all existing client pins to become inactive.
these tacks, do the following:

The waiting period required is equal to the length of time that pin activation
has been enabled for any servers at the hostname, or a maximum of 30 days.
Once the waiting period is elapsed, all TACKs for the hostname can be safely
removed.

(For example: If you start using a TACK for "example.com", then decide to
disable pin activation after one day, you can remove the TACK at the end of
the second day.)
Create a tack for a certificate's public key:
1) Run "tack sign KEY.pem CERT > TACK.pem".

Break signatures
-----------------
If you wish to abruptly stop publishing a TACK for a hostname, or abruptly
change the hostname's TACK key, or signal that a TACK key has been
compromised, then you may publish a "break signature" from the TACK key as
part of the TLS connection.
Deploy tacks to a hostname
1) Deploy tacks to each server at the hostname.
- Apache: Set "SSLTACKTackFile" to a tack file.
2) Set the activation flag on each server.
- Apache: Set "SSLTACKActivationFlags 1".
3) Test the site (if there are problems, see "Pin deactivation").
4) Whenever you change a server's certificate, you must replace its tack.

This break signature must remain published at the hostname until all pins
between the hostname and the old TACK key have become inactive (30 days at
most; this is exactly the same as the "waiting period" described in previous
section).

A break signature from a TACK key causes any client who encounters it to
discard all pins involving the TACK key. Thus, once a break signature is
published for a TACK key, all existing pins and TACKS for the TACK key cease
providing security.
Pin deactivation
=================
If you wish to stop using TACK for a hostname, simply disable the activation
flag at all servers for that hostname (Apache: "SSLTACKActivationFlags 0").
Then wait for all existing client pins to become inactive.

A server can have up to eight break signatures. However, keep in mind that
break signatures add to TLS handshake overhead, so are best avoided.
The waiting period required is equal to the length of time that the activation
flag has been enabled for any servers at the hostname, or a maximum of 30
days. Once the waiting period is elapsed, all tacks for the hostname can be
safely removed.

Create a break signature for a TACK:
1) Run "TACK.py break -k KEY.pem > TACK_Break_Sig.pem"
2) Add the break signature to your web server.
(For example: If you start using a tack for "example.com", then decide to
disable the activation flag after one day, you can remove the tack at the end
of the second day.)


Advanced uses
==============

Revoking older generations of a TACK
Revoking older generations of a tack
-------------------------------------
If a server's TLS public key (not its TACK key) has been compromised and you
are switching to a new TLS key, you may revoke the TACK for the old key by "-m
If a server's TLS key (not its TACK key) has been compromised and you are
switching to a new TLS key, you may revoke the tack for the old key by "-m
<min_generation>" in the "sign" command. <min_generation> is a number from
0-255 that is larger than the generation of the TACK you wish to revoke.
0-255 that is larger than the generation of the tack you wish to revoke.

Clients who encounter the new TACK will reject older generations from then on.
Prior to publishing a new <min_generation> you should replace all your TACKs
with this generation number (or higher) by signing with "-g <generation>".
Clients who encounter the new tack will reject older generation tacks from
then on. Prior to publishing a new <min_generation> you should replace all
your tacks with this generation number (or higher) by signing with "-g
<generation>".

For example: By default TACK signatures have generation=0, so the first time
you use this capability you will want to set "-m1" after pushing out a new set
of TACKs signed with "-g1". If you use it a second time, you will set "-m2",
and so on.
For example: By default tacks have generation=0, so the first time you use
this capability you will want to set "-m1" after pushing out a new set of
tacks signed with "-g1". If you use it a second time, you will set "-m2", and
so on.

Security Consideration: This only provides protection if clients receive the
new min_generation. For a more robust defense against SSL key compromise,
consider using short-lived TACKs.
new min_generation. For a more robust defense against TLS key compromise,
consider using short-lived tacks.

Short-lived TACKs
Short-lived tacks
------------------
Every TACK contains a signature covering a TLS public key. The TLS key is
contained in a certificate. By default the TACK signature is set to expire at
the same time as the certificate, and must be replaced by an updated TACK at
that point.
Every tack contains a signature covering a TLS public key. The TLS key is
contained in a certificate. By default the tack is set to expire at the same
time as the certificate, and must be replaced by an updated tack at that
point.

If you shorten the TACK's expiration time, then a compromised SSL certificate
will become unusable to an attacker once the TACK expires. For example, every
day at midnight you could deploy a new TACK that expires within 48 hours.
If you shorten the tack's expiration time, then a compromised TLS key will
become unusable to an attacker once the tack expires. For example, every day
at midnight you could deploy a new tack that expires within 48 hours.

A good way to handle short-lived TACKs is to generate a batch of them and
store the TACKs on a secure system that distributes them to servers. This way,
you do not have to use your TACK key to sign new TACKs frequently.
A good way to handle short-lived tacks is to generate a batch of them and
store the tacks on a secure system that distributes them to servers. This way,
you do not have to use your TACK key to sign new tacks frequently.

You can generate a batch of TACKs with the "-n NUM@INTERVAL" argument to
"sign", specifying the number of TACKs and the interval between their
You can generate a batch of tacks with the "-n NUM@INTERVAL" argument to
"sign", specifying the number of tacks and the interval between their
expiration times. The "-o" argument is taken as a filename prefix, and the
"-e" time is used as the first expiration time. Example:

TACK.py sign -k KEY.pem -c CERT -n 365@1d -e 2013-01-02Z -o T1
tack sign KEY.pem CERT -n 365@1d -e 2013-01-02Z -o T1

produces 365 TACKs, one expiring at midnight (UTC) each day of 2013:
produces 365 tacks, one expiring at midnight (UTC) each day of 2013:
T1_0000.pem
T1_0001.pem
T1_0002.pem
...
T1_0364.pem

TACK Key rollover
------------------
You may "rollover" a hostname from one TACK key to another without an
interruption in security by publishing two tacks simultaneously. This allows
clients to form pins based on the second tack prior to the first tack being
removed.

To perform a rollover, simply append the new tack to the SSLTACKTackFile, and
set the SSLTACKActivationFlags to 3 (1 activates the first tack, 2 activates
the second tack, and 3 activates both). Allow at least 30 days, then
deactivate the first tack by setting SSLTACKActivationFlags to 2. Allow at
least another 30 days, then delete the first tack and set
SSLTACKActivationFlags to 1. The rollover is now complete.
5 changes: 0 additions & 5 deletions TACKpy/__init__.py

This file was deleted.

Loading