<div dir="ltr"><font face="monospace, monospace">Thanks to Michael, I was able to answer this question.</font><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">If anyone is interested, here is how I solved it:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">A .der file in the crosscert path is made of your own private CA and the cross-signed root CA.  They are joined together using an ASN.1 SET directive.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">In python, it's as simple as this:</font></div><div><font face="monospace, monospace"><br></font></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div style="font-size:12.8000001907349px"><div><font face="monospace, monospace">import pyasn1</font></div></div></div><div><div style="font-size:12.8000001907349px"><div><font face="monospace, monospace"><br></font></div></div></div><div><div style="font-size:12.8000001907349px"><div><font face="monospace, monospace">from pyasn1.codec.der import decoder</font></div></div></div><div><div style="font-size:12.8000001907349px"><div><font face="monospace, monospace">from pyasn1.codec.der import encoder</font></div></div></div></blockquote><div><div style="font-size:12.8000001907349px"><div><font face="monospace, monospace"><br></font></div></div></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px"><div><div style="font-size:12.8000001907349px"><div><font face="monospace, monospace">def CreateFinalSet(certs):</font></div></div></div><div><div style="font-size:12.8000001907349px"><font face="monospace, monospace"><span style="font-size:12.8000001907349px">  s = pyasn1.type.univ.Set()</span></font></div></div><div><div style="font-size:12.8000001907349px"><font face="monospace, monospace">  for i, c in enumerate(certs):</font></div></div><div><div style="font-size:12.8000001907349px"><font face="monospace, monospace">    s.setComponentByPosition(i, decoder.decode(c)[0])</font></div></div><div><div style="font-size:12.8000001907349px"><font face="monospace, monospace"><br></font></div></div><div><div style="font-size:12.8000001907349px"><font face="monospace, monospace">  return encoder.encode(s)</font></div></div></blockquote><div style="font-size:12.8000001907349px"><font face="monospace, monospace"><br></font></div><div style="font-size:12.8000001907349px"><font face="monospace, monospace"><br></font></div><div style="font-size:12.8000001907349px"><font face="monospace, monospace">The input "certs" is a list of certificates (the data, not the filenames) in .der format.</font></div><div style="font-size:12.8000001907349px"><font face="monospace, monospace">the output is the actual content of the final der file you need to write in your crosscert path.</font></div><div style="font-size:12.8000001907349px"><font face="monospace, monospace"><br></font></div><div style="font-size:12.8000001907349px"><font face="monospace, monospace">The next step is to be able to find the name of the .der file in the crosscert path.  It's a checksum of something, but it was not clear to me what it was.</font></div><div style="font-size:12.8000001907349px"><font face="monospace, monospace"><br></font></div><div style="font-size:12.8000001907349px"><font face="monospace, monospace">Here's the code that given an original root CA (not modified, der format), returns the filename to use for its crosscert.</font></div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px"><font face="monospace, monospace"><br></font></div><div style="font-size:12.8000001907349px"><blockquote style="font-size:12.8000001907349px;margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace">  # Decode the ASN</font></div><div><font face="monospace, monospace">  decoded_data = decoder.decode(ca_data)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  # Enter the ASN.1 sequence.</font></div><div><font face="monospace, monospace">  decoded_data = decoded_data[0]</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  # Enter the inner sequence.</font></div><div><font face="monospace, monospace">  assert isinstance(decoded_data, pyasn1.type.univ.Sequence)</font></div><div><font face="monospace, monospace">  decoded_data = decoded_data[0]</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  # Skip one or two Integer items, then take the forth Sequence.</font></div><div><font face="monospace, monospace">  base = 0</font></div><div><font face="monospace, monospace">  assert isinstance(decoded_data[base], pyasn1.type.univ.Integer)</font></div><div><font face="monospace, monospace">  if isinstance(decoded_data[base + 1], pyasn1.type.univ.Integer):</font></div><div><font face="monospace, monospace">    base += 1</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  assert isinstance(decoded_data[base + 1], pyasn1.type.univ.Sequence)</font></div><div><font face="monospace, monospace">  assert isinstance(decoded_data[base + 2], pyasn1.type.univ.Sequence)</font></div><div><font face="monospace, monospace">  assert isinstance(decoded_data[base + 3], pyasn1.type.univ.Sequence)</font></div><div><font face="monospace, monospace">  assert isinstance(decoded_data[base + 4], pyasn1.type.univ.Sequence)</font></div><div><font face="monospace, monospace"><br></font></div></blockquote><blockquote style="font-size:12.8000001907349px;margin:0px 0px 0px 40px;border:none;padding:0px"><font face="monospace, monospace">  subject = decoded_data[base + 4]</font></blockquote><blockquote style="font-size:12.8000001907349px;margin:0px 0px 0px 40px;border:none;padding:0px"><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><div>  checksum = binascii.crc32(encoder.encode(subject))</div><div>  return '%08x.der' % ((checksum & 0xffffffff) ^ 0xffffffff)</div></font></div></blockquote></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Thanks again,</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Nicolas</font></div><div class="gmail_extra"><font face="monospace, monospace"><br></font><div class="gmail_quote"><font face="monospace, monospace">On Mon, Apr 13, 2015 at 4:59 PM, Nicolas Sylvain <span dir="ltr"><<a href="mailto:nsylvain@gmail.com" target="_blank">nsylvain@gmail.com</a>></span> wrote:<br></font><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><font face="monospace, monospace">Here's a slightly simpler question:</font><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">How are the .der files on <a href="http://ca.ipxe.org/auto" target="_blank">ca.ipxe.org/auto</a> generated?</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">I don't seem to be able to look at them :</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">$ wget <a href="http://ca.ipxe.org/auto/5df65e6d.der" target="_blank">http://ca.ipxe.org/auto/5df65e6d.der</a><br></font></div><div><div><font face="monospace, monospace">$ openssl x509 -inform der -in 5df65e6d.der -text</font></div><div><font face="monospace, monospace">unable to load certificate</font></div><div><font face="monospace, monospace">140302646982304:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1337:</font></div><div><font face="monospace, monospace">140302646982304:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:388:Type=X509</font></div></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">If I create my own cross-signed certificates using the commands in <a href="http://ipxe.org/crypto" target="_blank">ipxe.org/crypto</a> and convert them to .der files using openssl, I get this error :</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br><br></font></div><div><div><font face="monospace, monospace"><a href="https://SOMETHING.appspot.com/somepath." target="_blank">https://SOMETHING.appspot.com/somepath.</a>..</font></div><div><font face="monospace, monospace">TLS 0xe9fb4 using protocol version 3.3</font></div><div><font face="monospace, monospace">TLS 0xe9fb4 selected rsa-aes_cbc-128-sha256</font></div><div><font face="monospace, monospace">[...]</font></div><div><font face="monospace, monospace">CERTSTORE added certificate *.<a href="http://appspot.com" target="_blank">appspot.com</a><br></font></div><div><font face="monospace, monospace">X509 chain 0xe9cd4 added X509 0xed6f4 "*.<a href="http://appspot.com" target="_blank">appspot.com</a>"</font></div><div><font face="monospace, monospace">TLS 0xe9fb4 found certificate *.<a href="http://appspot.com" target="_blank">appspot.com</a></font></div><div><font face="monospace, monospace">[...]</font></div><div><font face="monospace, monospace">CERTSTORE added certificate Google Internet Authority G2<br></font></div><div><font face="monospace, monospace">X509 chain 0xe9cd4 added X509 0xedc84 "Google Internet Authority G2"</font></div><div><font face="monospace, monospace">TLS 0xe9fb4 found certificate Google Internet Authority G2</font></div><div><font face="monospace, monospace">[...]</font></div><div><font face="monospace, monospace">CERTSTORE added certificate GeoTrust Global CA<br></font></div><div><font face="monospace, monospace">X509 chain 0xe9cd4 added X509 0xee134 "GeoTrust Global CA"</font></div><div><font face="monospace, monospace">TLS 0xe9fb4 found certificate GeoTrust Global CA</font></div><div><font face="monospace, monospace">.X509 chain 0xe9cd4 found no usable certificates</font></div><div><font face="monospace, monospace">VALIDATOR 0xea264 downloading cross-signed certificate from <a href="http://10.0.0.1/5df65e6d.der?subject=ME4xCzAJBgNVBAYTAlVTM" target="_blank">http://10.0.0.1/5df65e6d.der?subject=ME4xCzAJBgNVBAYTAlVTM</a></font></div><div><font face="monospace, monospace">RAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHk=</font></div><div><font face="monospace, monospace">HTTP 0xea6c4 response "HTTP/1.0 200 OK"</font></div><div><font face="monospace, monospace">HTTP 0xea6c4 header "Server: SimpleHTTP/0.6 Python/2.7.6"</font></div><div><font face="monospace, monospace">HTTP 0xea6c4 header "Date: Mon, 13 Apr 2015 23:52:37 GMT"</font></div><div><font face="monospace, monospace">HTTP 0xea6c4 header "Content-type: application/octet-stream"</font></div><div><font face="monospace, monospace">HTTP 0xea6c4 header "Content-Length: 769"</font></div><div><font face="monospace, monospace">HTTP 0xea6c4 header "Last-Modified: Mon, 13 Apr 2015 23:51:41 GMT"</font></div><div><font face="monospace, monospace">HTTP 0xea6c4 start of data</font></div><div><font face="monospace, monospace">ASN1 0x17d560 type mismatch (expected 49, got 48)</font></div><div><font face="monospace, monospace">VALIDATOR 0xea264 could not enter certificateSet: Error 0x3e00e03b (<a href="http://ipxe.org/3e00e03b" target="_blank">http://ipxe.org/3e00e03b</a>)</font></div><div><font face="monospace, monospace">TLS 0xe9fb4 certificate validation failed: Error 0x3e00e03b (<a href="http://ipxe.org/3e00e03b" target="_blank">http://ipxe.org/3e00e03b</a>)</font></div><div><font face="monospace, monospace">Error 0x3e00e03b (<a href="http://ipxe.org/3e00e03b" target="_blank">http://ipxe.org/3e00e03b</a>)</font></div></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Somehow it wanted a "set" and I sent a "sequence", but I'm afraid I don't understand the difference yet.<br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Thank you,</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Nicolas</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><font face="monospace, monospace"><br></font><div class="gmail_quote"><font face="monospace, monospace">On Thu, Apr 9, 2015 at 2:41 PM, Nicolas Sylvain <span dir="ltr"><<a href="mailto:nsylvain@gmail.com" target="_blank">nsylvain@gmail.com</a>></span> wrote:<br></font><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><font face="monospace, monospace">Hello,</font><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Since my firewall blocks pretty much everything, including <a href="http://ca.ipxe.org" target="_blank">ca.ipxe.org</a>. I got around to making https connections with iPXE by mirroring <a href="http://ca.ipxe.org" target="_blank">ca.ipxe.org</a> and using the crosscert command.  Unfortunately, to make that work, I had to disable OCSP in the code. <br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">I'd like to unfork my code, and to do that, I believe I need to create my own CA and cross signed certificates.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Right now I'm only accessing some resources hosted on Google servers. (appengine, google cloud storage). It seems like all those servers have certificates trusted by GeoTrust Global CA.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Here's what I tried to do:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">1. Follow the instructions on <a href="http://ipxe.org/crypto" target="_blank">http://ipxe.org/crypto</a> to create my own CA</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">2. Download the Geotrust Global CA certs from <a href="http://ca.ipxe.org/raw/" target="_blank">http://ca.ipxe.org/raw/</a></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">3. Cross sign those certs using the instructions on the page above.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">4. Build iPXE using :</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><div><font face="monospace, monospace"> make bin/ipxe.usb EMBED=startup.ipxe CERT=geotrust-global-ca-2-cross.crt,geotrust-global-ca-cross.crt,ca.crt TRUST=ca.crt</font></div></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Then during boot, on the first attempt at using https, I get this error : <a href="http://ipxe.org/err/0216eb" target="_blank">http://ipxe.org/err/0216eb</a></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">I also tried to pass the geotrust certs as-in on both CERT and TRUST, but that did not work either.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Any idea what I'm doing wrong? I assume it's pretty obvious, as I don't understand much about certificates yet...  but if you need more verbose logs, let me know and I can provide them.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Thanks</font></div><span><font color="#888888" face="monospace, monospace"><div><br></div><div>Nicolas</div><div><br></div><div><br></div><div><br></div><div><br></div></font></span></div>
</blockquote></div><font face="monospace, monospace"><br></font></div>
</div></div></blockquote></div><br></div></div>