VISA Direct + JKS

create JKS

during create project in sandbox save your private key - privateKey.pem
https://developer.visa.com/ -> Credentials -> download

  • Project Certificate - cert.pem
  • Common Certificates - VDPCA-SBX.pem, DigiCertGlobalRootCA.crt
1
2
3
4
openssl pkcs12 -export -in cert.pem -inkey "privateKey.pem" -certfile cert.pem -out key.p12
keytool -importkeystore -srckeystore key.p12 -srcstoretype PKCS12 -destkeystore key.jks
keytool -import -alias ejbca -keystore key.jks -file VDPCA-SBX.pem -storepass <KEYSTORE_PASSWORD>
keytool -import -alias digica -keystore key.jks -file DigiCertGlobalRootCA.crt -storepass <KEYSTORE_PASSWORD>

Debug mobile app

HTTP Proxy

mitm

http proxy

install https://mitmproxy.org and run web interface

1
2
brew install mitmproxy
mitmweb

after configure your local device wifi connection to work over your local computer ip

1
ifconfig

перейдем в браузере по адресу http://mitm.it и нажмем на иконку Apple для скачивания сертификата Mitmproxy.

reverse proxy

1
2
mitmweb -p 443 --mode=reverse:http://localhost:8040 \ 
--cert api-staging.fin.do=api_staging_fin_do.pem --cert api.fin.do=api_fin_do.pem

example of cert file

1
2
3
4
5
6
7
8
vim api_fin_do.pem
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
...other certs

burp

известный сетевой тул с большим количеством функционала.
Правда reverse-proxy у меня не получилось на нем настроить
для анализа запросов которые приходят на локальную LOCAL среду разработки

MAC.ACL

recursive access to specific directory for user on MacOS

1
chmod -R +a "alexb allow write,add_file,add_subdirectory" ~/code/study-search-service

Docker. Utils

to run any version of utils without install them locally

1
2
docker run --rm -it wurstmeister/kafka:1.1.0 \
kafka-consumer-groups.sh --bootstrap-server HOST:9092 --group user-phone-book-PROD-processingGroup --describe

Kafka. Options

Spring Cloud Stream

kafka

  • session.timeout.ms = 10000 интервал ответа на heartbeat. до версии <=0.10.0 он так же отвечал за максимальное время обработки сообщения, позже появился max.poll.interval.ms. необходимо установить session.timeout.ms достаточно большим, чтобы сбои при перебалансировках происходили реже. Как упомянуто выше, единственным недостатком этого является более длительная задержка переназначения партиций в случае серьезного сбоя (когда потребитель не может быть чисто завершен с помощью close()), что на практике редко происходит.
  • max.poll.interval.ms = 300000 >=0.10.1 время обработки сообещения консюмером
  • max.poll.records = 500 количество записей на одну обработку
  • heartbeat.interval.ms = 3000 контролирует, как часто потребитель должен отправлять heartbeats-сообщения координатору. Это также способ, когда необходимость перебалансировки определяется засчет потребителя, поэтому более короткий интервал heartbeats-сообщений обычно означает более быструю перебалансировку.
  • enable.auto.commit потребитель автоматически фиксирует смещения с заданным в auto.commit.interval.ms интервалом (по умолчанию – 5 секунд)
  • auto.offset.reset определяет поведение потребителя, когда нет зафиксированной позиции смещения (в случае, когда группа инициализируется впервые), или когда оно выходит за пределы диапазона. Можно установить сброс положения на самое раннее смещение – earliest, либо на самое позднее – latest (задано по умолчанию). Также можно выбрать значение none для самостоятельной установки начального смещения и ручной обработки ошибок вне диапазона.
  • max.partition.fetch.bytes чтобы ограничить объем данных, возвращаемых в одном пакете, но при этом приходится учитывать, сколько партиций содержится в подписанных топиках.
  • fetch.min.bytes объема данных, возвращаемых в каждом poll()
  • fetch.max.wait.ms

producer

  • request.required.acks =
    • 0 не ждать подтверждения о записи сообщения в брокер
    • 1 ждать подтверждения после записи в master брокер
    • -1 ждать подтверждения после записи во все синхронные партиции (min.insync.replicas.per.topic)
    • all – сообщение не только допущено к записи лидером партиции, но и успешно скопировано на все синхронизированные реплики

Spring Cloud Stream

binder

  • spring.cloud.stream.kafka.binder.configuration: - key/value map of client properties (both producers and consumer)
  • spring.cloud.stream.kafka.binder.autoCreateTopics: true the binder will create new topics automatically. Of note, this setting is independent of the auto.topic.create.enable setting of the broker and it does not influence it: if the server is set to auto-create topics, they may be created as part of the metadata retrieval request, with default broker settings.
  • spring.cloud.stream.kafka.binder.autoAddPartitions: false

consumer

  • spring.cloud.stream.kafka.bindings..consumer.autoCommitOffset: true - делать ли авто-ACK сообщения после его обработки, или посылать этот ACK вручную из кода (AckMode.MANUAL)
  • spring.cloud.stream.kafka.bindings..consumer.enableDlq: false - создавать ли отдельную очередь и помещать ли туда сообщения которые неполучилось обработать
  • spring.cloud.stream.kafka.bindings..consumer.configuration: - key/value pair containing generic Kafka consumer properties

producer

  • spring.cloud.stream.kafka.bindings..producer.configuration: - key/value pair containing generic Kafka producer properties

Proxy in Java

Console

gradle + http proxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vim gradle.properties

#http proxy setup
systemProp.http.proxyHost=<IP>
systemProp.http.proxyPort=<PORT>
#systemProp.http.proxyUser=userid
#systemProp.http.proxyPassword=password
systemProp.http.nonProxyHosts=*.nonproxyrepos.com|localhost
#https proxy setup
systemProp.https.proxyHost=<IP>
systemProp.https.proxyPort=<PORT>
#systemProp.https.proxyUser=userid
#systemProp.https.proxyPassword=password
systemProp.https.nonProxyHosts=*.nonproxyrepos.com|localhost

gradle + SOCKS

1
2
3
vim gradle.properties

org.gradle.jvmargs=-DsocksProxyHost=<IP> -DsocksProxyPort=<PORT>

java + SOCKS

1
$ JAVA_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=5433" ./bin/catalina.sh run

MacOS

http proxy server http://squidman.net/squidman/

socks client over ssh https://www.opoet.com/pyro/

jenv

для установки в MacOS нескольких версий java паралельно

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
35
36
37
$ brew cask install java
$ brew install jenv
$ echo 'eval "$(jenv init -)"' >> ~/.bash_profile

$ ls /Library/Java/JavaVirtualMachines/
$ jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home
$ jenv add /Library/Java/JavaVirtualMachines/jdk1.7.0_80.jdk/Contents/Home
$ jenv add /Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home
$ jenv rehash

$ jenv versions

$ java -version
$ jenv global oracle64-1.8.0.131

$ cd $ODIN_HOME
$ jenv local oracle64-1.7.0.80
$ cat .java-version
oracle64-1.7.0.80

$ java -version
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
$ cd ..
$ java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

# for startup scripts used by Tomcat, sbt and others
mPolitech:odin-home panser$ echo $JAVA_HOME

mPolitech:odin-home panser$ jenv exec bash
bash-3.2$ echo $JAVA_HOME
/Users/panser/.jenv/versions/oracle64-1.7.0.80
bash-3.2$

MySQL access

ro

1
2
3
4
CREATE USER 'admin_ro'@'%' IDENTIFIED BY 'XXXXXXX';
GRANT SELECT ON *.* TO 'admin_ro'@'%';
GRANT EXECUTE ON *.* TO 'admin_ro'@'%';
FLUSH PRIVILEGES;

Keytool

1
2
3
4
5
6
$ vim ~/tomcat8/conf/server.xml

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" alias="tomcat"
keystoreFile="/home/appsqedit/.tomcatkeystore" keystorePass="changeit" />
1
2
3
4
5
6
7
8
просмотр сертификатов в хранилище
$ keytool -list -v -keystore /home/appsqedit/.tomcatkeystore

добавление CA сертификата в хранилище
$ keytool -list -v -keystore /home/appsqedit/.tomcatkeystore | grep caIssuers -A 1
$ wget http://crt.comodoca.com/COMODORSADomainValidationSecureServerCA.crt
$ cp -v /home/appsqedit/.tomcatkeystore{,_BAK}
$ keytool -import -trustcacerts -file COMODORSADomainValidationSecureServerCA.crt -alias comodoValidationCA -keystore /home/appsqedit/.tomcatkeystore

Import a signed primary certificate to an existing Java keystore

1
keytool -import -trustcacerts -alias skedit.io -file /home/appsqedit/skedit_io.crt -keystore /home/appsqedit/.tomcatkeystore

SSL+tomcat from @Alex

1
2
3
4
5
6
7
8
9
10
11
# vim /home/appsqedit/certs/domain.crt
-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----
# vim /home/appsqedit/key/domain.key
-----BEGIN RSA PRIVATE KEY-----
... another one
-----END RSA PRIVATE KEY-----

# openssl pkcs12 -export -in domain.crt -inkey domain.key -out server.p12 -name tomcat -CAfile ca.crt -caname root
# keytool -importkeystore -destkeystore /home/appsqedit/.skeditio_keystore -srckeystore server.p12 -srcstoretype PKCS12 -alias tomcat

import public certificate to keystore

1
2
openssl s_client -showcerts -connect api.fin.do:443 </dev/null 2>/dev/null|openssl x509 -outform PEM > /tmp/mycertfile.pem
keytool -import -trustcacerts -alias api.fin.do -file /tmp/mycertfile.pem -keystore keystore.p12

import public+private certificate to keystore

1
2
3
4
# combines your SSL certificate api_fin_do.crt and your private key api.fin.do.key into a single file, api_fin_do.p12
openssl pkcs12 -export -in api_fin_do.crt -inkey api.fin.do.key -out api_fin_do.p12 -name api_fin_do -CAfile ca_1.crt -CAfile ca_2.crt
# import pkcs.p12 to existing keystore keystore.jks
keytool -importkeystore -destkeystore api_fin_do.jks -srckeystore api_fin_do.p12 -srcstoretype PKCS12 -alias api_fin_do