Sunday, March 23, 2014

Select and copy text within Quick Look previews

I'm a big Apple fan and my first work station was Macbook Air. Now i switched to Macbook pro and recently found a nice solution that allows you to copy text from Quick Look preview - it makes my life way more easier and handy. Here's how you can do it :
  • Open Terminal
  • Paste next command :
defaults write com.apple.finder QLEnableTextSelection -bool TRUE; killall Finder
And that's it! Now you can find any text file, push Space button and you'll get Quick Look preview of it. Now you can select text from it and copy -> paste into another place.

In case if you want to disable this feature , you can always run next command in the Terminal :
defaults delete com.apple.finder QLEnableTextSelection; killall Finder

Thursday, January 9, 2014

InstallCert.java - console app that allows you to get and download ssl keys from webservice you're trying to work with

Recently i was working on one of my Test Frameworks for API and i had to work with https. I faced with :
javax.net.ssl.SSLHandshakeException: 
   sun.security.validator.ValidatorException: PKIX path building failed: 
   sun.security.provider.certpath.SunCertPathBuilderException: 
   unable to find valid certification path to requested target
 
Caused by: sun.security.validator.ValidatorException: 
   PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: 
   unable to find valid certification path to requested target
 
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: 
   unable to find valid certification path to requested target
exception during their execution. The reason was that i was working with dev server that has self signed certificate, which was absent in my local keystore. So, i googled a little bit and found this nice Java console app that allowed you in a very simple manner get a certificate. But in my case i need to use Proxy sometimes and that's why i decided to improve this app and add proxying possibilities to it. Final result can be found here    
Here's how it works : The most simple way is
java InstallCert host=google.com
In this case InstallCert will look for ssl certificates on https://google.com:443. Here's it's output
host = google.com
Connecting to address without enabled proxy settings.
Loading KeyStore C:\Program Files\Java\jre7\lib\security\cacerts...
Opening connection to google.com:443...
Starting SSL handshake...

No errors, certificate is already trusted

Server sent 3 certificate(s):

 1 Subject CN=*.google.com, O=Google Inc, L=Mountain View, ST=California, C=US
   Issuer  CN=Google Internet Authority G2, O=Google Inc, C=US
   sha1    3c 6b de 6c a0 a1 ae 6a e9 d5 bf b3 67 ab 12 4e 1b 98 8b fb
   md5     27 91 da c0 73 30 85 db e3 23 ef 7d 6f aa 7f cd

 2 Subject CN=Google Internet Authority G2, O=Google Inc, C=US
   Issuer  CN=GeoTrust Global CA, O=GeoTrust Inc., C=US
   sha1    d8 3c 1a 7f 4d 04 46 bb 20 81 b8 1a 16 70 f8 18 34 51 ca 24
   md5     9e 4a c9 64 74 24 51 29 d9 76 67 00 41 2a 1f 89

 3 Subject CN=GeoTrust Global CA, O=GeoTrust Inc., C=US
   Issuer  OU=Equifax Secure Certificate Authority, O=Equifax, C=US
   sha1    73 59 75 5c 6d f9 a0 ab c3 06 0b ce 36 95 64 c8 ec 45 42 a3
   md5     2e 7d b2 a3 1d 0e 3d a4 b2 5f 49 b9 54 2a 2e 1a

Enter certificate to add to trusted keystore or 'q' to quit: [1]
You simply press 1 and hit Enter button. As a result, you'll have your certificate added to your default keystore
[
[
  Version: V3
  Subject: CN=*.google.com, O=Google Inc, L=Mountain View, ST=California
  Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

  Key:  Sun EC public key, 256 bits
  public x coord: 656756547611416355835880201008930358845723006450213197
628251447943028
  public y coord: 396827319974765304927937356957360152389742209992235777
66752587796918
  parameters: secp256r1 [NIST P-256, X9.62 prime256v1] (1.2.840.10045.3.
  Validity: [From: Wed Dec 11 13:34:50 CET 2013,
               To: Thu Apr 10 02:00:00 CEST 2014]
  Issuer: CN=Google Internet Authority G2, O=Google Inc, C=US
  SerialNumber: [    4445eb4c d2c191ad]

Certificate Extensions: 9
[1]: ObjectId: 1.3.6.1.5.5.7.1.1 Criticality=false
AuthorityInfoAccess [
  [
   accessMethod: caIssuers
   accessLocation: URIName: http://pki.google.com/GIAG2.crt
,
   accessMethod: ocsp
   accessLocation: URIName: http://clients1.google.com/ocsp
]
]
...

[9]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 4E A2 DC AC DF 9C 45 35   DE A0 F7 C1 0A A6 88 19  N.....E5.......
0010: B7 6B D1 F7                                        .k..
]
]

]
  Algorithm: [SHA1withRSA]
  Signature:
0000: 71 BD 84 65 33 2E 28 65   AB 5D 2A C8 1F 38 47 9A  q..e3.(e.]*..8G
0010: 43 DF BF 49 70 45 56 4C   D9 D8 31 67 53 B5 82 40  C..IpEVL..1gS..
0020: 4B BE D4 61 39 82 A7 25   7A 7F 27 B9 AE F0 1F 32  K..a9..%z.'....
0030: 38 1E 7B 32 C9 8A A1 8E   C6 66 5B 45 96 85 25 FB  8..2.....f[E..%
0040: DB D7 05 9B 40 1B 44 DC   8D 19 2D 94 0F FE 0B 67  ....@.D...-....
0050: E9 7D 8F 2B 93 50 B4 51   DF D0 97 4A A1 73 B3 46  ...+.P.Q...J.s.
0060: 26 A8 E7 21 20 5D 5E 86   5D C2 1B D9 0B B9 E5 95  &..! ]^.]......
0070: FE 87 2F 2A 99 B1 3D 8D   F9 59 A6 B6 0B A4 A4 91  ../*..=..Y.....
0080: 81 4E EA 03 8F 6C 42 18   89 27 2C 88 C6 E9 50 A9  .N...lB..',...P
0090: 45 69 1E 82 BD 22 48 2B   A0 5C E9 37 86 51 CD 57  Ei..."H+.\.7.Q.
00A0: 8B C6 ED 7E FE E7 B6 F8   FC 82 9E AE E5 9D 1E 74  ...............
00B0: 18 5C 34 4C 2B 7A C5 3C   C1 9B D5 AF F3 33 6C E8  .\4L+z.<.....3l
00C0: AE 94 B1 3A 0B CD BD EF   9D 75 46 BD 91 F0 C0 55  ...:.....uF....
00D0: D2 87 46 5B AF 8B A1 9A   0F 8E 06 C4 F1 42 7C AB  ..F[.........B.
00E0: 58 79 59 A5 F3 4D 98 6C   8C 97 93 B0 0E 8E A1 3E  XyY..M.l.......
00F0: BF 11 83 D0 95 22 27 69   6A E8 66 84 8C 59 0D 49  ....."'ij.f..Y.

]

Added certificate to keystore 'cacerts' using alias 'google.com-1'
To check that everything went well you can run this command again and you should see :
Opening connection to google.com:443...
Starting SSL handshake...

No errors, certificate is already trusted
Besides that you can also specify :
  • Host port. If it's not standart 443 then you need to add to your command hostPort=[portNumber]
  • If you would like to address your request through proxy first, then you need to specify proxyHost=[hostName] proxyPort=[portNumber]
  • If your keystore has non-default password then passphrase=[passphrase] should be also added to the command. That's it :)